Merge remote-tracking branch 'origin/develop' into zhaoyun

This commit is contained in:
2026-06-17 11:54:05 +08:00
238 changed files with 11609 additions and 1871 deletions

View 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 检验系统LIS3项缺失
| # | 缺失能力 | 三甲依据 | 实现方案 | 预估工时 |
|---|---------|---------|---------|:-------:|
| 24 | **室内质控(Westgard规则)** | 质量管理 | 质控图+Westgard规则+失控处理 | 3天 |
| 25 | **室间质评** | 质量管理 | 参加省级/国家级室间质评 | 2天 |
| 26 | **检验报告标准格式打印** | 基本功能规范 | 标准检验报告单模板 | 1天 |
**小计**: 6天
### 2.7 检查系统PACS4项缺失
| # | 缺失能力 | 三甲依据 | 实现方案 | 预估工时 |
|---|---------|---------|---------|:-------:|
| 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-44周
**目标**: 补齐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-84周
**目标**: 补齐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-124周
**目标**: 补全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-153周
**目标**: 满足广西地方要求
```
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 开发

Binary file not shown.

View 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 R4CDA文档代码映射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 元/人天*

Binary file not shown.

Binary file not shown.

View 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 选型 | 信创优势 |
|--------|:------------------:|---------|
| **开发语言** | JavaSpring 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 芯片** | 鲲鹏 920ARM、飞腾 S2500/S5000CARM、海光x86 | ✅ 兼容 |
| **操作系统** | 银河麒麟 V10/V11、统信 UOS V20、openEuler 22.03+ | ✅ 兼容 |
| **数据库** | PostgreSQL当前、openGauss、达梦 DM8、人大金仓 KingbaseES V8 | ✅ 兼容 |
| **中间件** | 内嵌 Spring BootTomcat、可适配东方通 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)

Binary file not shown.

View 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 菜单调整,不涉及代码改动,可随时回滚。

View 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

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View 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 是一款面向三级甲等综合医院的综合信息管理系统,覆盖门诊、住院、手术、药房、检验检查、医保对接等核心业务场景。*
*了解更多:[联系方式]*

Binary file not shown.

After

Width:  |  Height:  |  Size: 80 KiB

View 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

Binary file not shown.

View File

@@ -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 patientName, String approvalStatus, String bloodComponent, Integer pageNum, Integer pageSize);
void approve(Long id, String approvalStatus, String approverName, String remark);
void observe(BloodTransfusionObservation observation);
Map<String, Object> getRecordDetail(Long id);
}

View File

@@ -0,0 +1,78 @@
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 patientName, String approvalStatus, String bloodComponent, Integer pageNum, Integer pageSize) {
LambdaQueryWrapper<BloodTransfusionRecord> w = new LambdaQueryWrapper<>();
if (patientName != null && !patientName.isEmpty()) {
w.like(BloodTransfusionRecord::getDoctorName, patientName);
}
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, String remark) {
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) {
result.put("error", "记录不存在");
return result;
}
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;
}
}

View File

@@ -0,0 +1,55 @@
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 patientName,
@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(patientName, 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,
@RequestParam(required = false) String remark) {
appService.approve(id, approvalStatus, approverName, remark);
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));
}
}

View File

@@ -1,10 +1,12 @@
package com.healthlink.his.web.inpatientmanage.appservice;
import com.core.common.core.domain.R;
import com.healthlink.his.web.inpatientmanage.dto.BatchNursingRecordDto;
import com.healthlink.his.web.inpatientmanage.dto.NursingEmrTemplateDto;
import com.healthlink.his.web.inpatientmanage.dto.NursingRecordDto;
import com.healthlink.his.web.inpatientmanage.dto.NursingSearchParam;
import jakarta.servlet.http.HttpServletRequest;
import java.util.List;
@@ -100,4 +102,13 @@ public interface INursingRecordAppService {
*/
R<?> updateEmrTemplate(NursingEmrTemplateDto emrTemplateDto);
/**
* 批量保存护理记录单
*
* @param batchDto 批量入参
* @return 结果
*/
R<?> batchSaveRecord(BatchNursingRecordDto batchDto);
}

View File

@@ -399,4 +399,77 @@ public class NursingRecordAppServiceImpl implements INursingRecordAppService {
return emrTemplateService.updateById(emrTemplate) ? R.ok() : R.fail();
}
/**
* 批量保存/更新/删除护理记录
*
* @param batchDto 批量提交数据包
* @return 结果
*/
@Override
@Transactional(rollbackFor = Exception.class)
public R<?> batchSaveRecord(BatchNursingRecordDto batchDto) {
Long recorderId = SecurityUtils.getLoginUser().getPractitionerId();
java.util.Map<String, Long> tempIdToRealIdMap = new java.util.HashMap<>();
// 1. 处理待删除记录 (物理删除记录及体征表对应数据)
if (batchDto.getDeleted() != null && !batchDto.getDeleted().isEmpty()) {
this.delRecord(batchDto.getDeleted());
}
// 2. 处理待插入新建记录
if (batchDto.getInserted() != null && !batchDto.getInserted().isEmpty()) {
for (NursingRecordDto dto : batchDto.getInserted()) {
Emr emr = new Emr();
emr.setEncounterId(dto.getEncounterId())
.setPatientId(dto.getPatientId())
.setRecordId(recorderId)
.setRecordTime(dto.getRecordingTime())
.setClassEnum(1)
.setContextJson(dto.getContextJson());
emrService.save(emr);
// 保存生成的真实主键,用于返回给前端重置
if (dto.getTempId() != null && !dto.getTempId().isEmpty()) {
tempIdToRealIdMap.put(dto.getTempId(), emr.getId());
}
// 判断是否联动更新体征表
if (Boolean.TRUE.equals(dto.getVitalSignsSyncFlag())) {
this.vitalSigns(dto, recorderId);
}
}
}
// 3. 处理待更新已有记录
if (batchDto.getUpdated() != null && !batchDto.getUpdated().isEmpty()) {
for (NursingRecordDto dto : batchDto.getUpdated()) {
Emr emr = new Emr();
emr.setId(dto.getRecordId())
.setEncounterId(dto.getEncounterId())
.setPatientId(dto.getPatientId())
.setRecordId(recorderId)
.setRecordTime(dto.getRecordingTime())
.setClassEnum(1)
.setContextJson(dto.getContextJson());
emrService.updateById(emr);
// 联动体征处理
if (Boolean.TRUE.equals(dto.getVitalSignsSyncFlag())) {
this.vitalSigns(dto, recorderId);
} else {
this.deleteVitalSigns(dto);
}
}
}
// 组装返回映射表
java.util.Map<String, Object> resultMap = new java.util.HashMap<>();
resultMap.put("tempIdToRealIdMap", tempIdToRealIdMap);
return R.ok(resultMap, "批量护理记录保存成功!");
}
}

View File

@@ -2,9 +2,11 @@ package com.healthlink.his.web.inpatientmanage.controller;
import com.core.common.core.domain.R;
import com.healthlink.his.web.inpatientmanage.appservice.INursingRecordAppService;
import com.healthlink.his.web.inpatientmanage.dto.BatchNursingRecordDto;
import com.healthlink.his.web.inpatientmanage.dto.NursingEmrTemplateDto;
import com.healthlink.his.web.inpatientmanage.dto.NursingRecordDto;
import com.healthlink.his.web.inpatientmanage.dto.NursingSearchParam;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
@@ -144,4 +146,16 @@ public class NursingRecordController {
return nursingRecordAppService.updateEmrTemplate(emrTemplateDto);
}
/**
* 批量保存/更新/删除护理记录
*
* @param batchDto 批量提交数据包
* @return 结果
*/
@PostMapping("/batch-save")
public R<?> batchSaveRecord(@Validated @RequestBody BatchNursingRecordDto batchDto) {
return nursingRecordAppService.batchSaveRecord(batchDto);
}
}

View File

@@ -0,0 +1,29 @@
/*
* Copyright ©2023 CJB-CNIT Team. All rights reserved
*/
package com.healthlink.his.web.inpatientmanage.dto;
import lombok.Data;
import lombok.experimental.Accessors;
import java.util.List;
/**
* 护理记录批量提交包装 DTO
*
* @author Antigravity AI
* @date 2026-06-16
*/
@Data
@Accessors(chain = true)
public class BatchNursingRecordDto {
/** 待保存/新建的护理记录列表 */
private List<NursingRecordDto> inserted;
/** 待更新的护理记录列表 */
private List<NursingRecordDto> updated;
/** 待删除的护理记录列表 */
private List<NursingRecordDto> deleted;
}

View File

@@ -50,4 +50,8 @@ public class NursingRecordDto {
/** 是否同步到体温单 */
private Boolean vitalSignsSyncFlag;
/** 前端临时ID映射标识 */
private String tempId;
}

View File

@@ -4,7 +4,6 @@ import com.healthlink.his.orderclosedloop.domain.OrderExecuteStep;
import java.util.Map;
import java.util.List;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.metadata.IPage;
public interface IOrderClosedLoopAppService {
IPage<OrderExecuteRecord> listRecords(String orderNo, String orderType, String executeStatus, Integer pageNum, Integer pageSize);
Map<String, Object> getOrderStatus(Long orderId);
@@ -13,4 +12,6 @@ public interface IOrderClosedLoopAppService {
void cancelOrder(OrderExecuteRecord record);
Map<String, Object> getStatistics(String type, String groupBy, Integer pageNum, Integer pageSize);
void remindOrder(Map<String, Object> params);
Map<String, Object> getTrace(Long adviceId);
Map<String, Object> getStatisticsWithParams(String startDate, String endDate);
}

View File

@@ -7,7 +7,6 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.*;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.springframework.jdbc.support.JdbcUtils;
@Service
public class OrderClosedLoopAppServiceImpl implements IOrderClosedLoopAppService {
@Autowired private IOrderExecuteRecordService recordService;
@@ -215,4 +214,73 @@ public class OrderClosedLoopAppServiceImpl implements IOrderClosedLoopAppService
}
}
@Override
public Map<String, Object> getTrace(Long adviceId) {
Map<String, Object> result = new LinkedHashMap<>();
OrderExecuteRecord record = recordService.getById(adviceId);
if (record == null) {
result.put("error", "记录不存在");
return result;
}
result.put("record", record);
List<OrderExecuteStep> steps = stepService.list(
new LambdaQueryWrapper<OrderExecuteStep>()
.eq(OrderExecuteStep::getOrderNo, record.getOrderNo())
.orderByAsc(OrderExecuteStep::getStepOrder)
);
List<Map<String, Object>> timeline = new ArrayList<>();
for (OrderExecuteStep step : steps) {
Map<String, Object> node = new LinkedHashMap<>();
node.put("stepName", step.getStepName());
node.put("stepOrder", step.getStepOrder());
node.put("completed", step.getCompleted());
node.put("executorName", step.getExecutorName());
node.put("executeTime", step.getExecuteTime());
node.put("remark", step.getRemark());
String status;
if (Boolean.TRUE.equals(step.getCompleted())) {
status = "completed";
} else if (step.getStepOrder() < Integer.parseInt(record.getCurrentStep() != null ? record.getCurrentStep() : "1")) {
status = "completed";
} else if (step.getStepOrder().equals(Integer.parseInt(record.getCurrentStep() != null ? record.getCurrentStep() : "1"))) {
status = "current";
} else {
status = "pending";
}
node.put("status", status);
timeline.add(node);
}
result.put("timeline", timeline);
return result;
}
@Override
public Map<String, Object> getStatisticsWithParams(String startDate, String endDate) {
Map<String, Object> result = new LinkedHashMap<>();
LambdaQueryWrapper<OrderExecuteRecord> w = new LambdaQueryWrapper<>();
List<OrderExecuteRecord> records = recordService.list(w);
long total = records.size();
long executing = 0;
long completed = 0;
long stopped = 0;
for (OrderExecuteRecord r : records) {
String status = r.getExecuteStatus();
if ("completed".equals(status)) {
completed++;
} else if ("cancelled".equals(status)) {
stopped++;
} else {
executing++;
}
}
result.put("totalOrders", total);
result.put("executingCount", executing);
result.put("completedCount", completed);
result.put("stoppedCount", stopped);
result.put("executeRate", total > 0 ? Math.round((executing + completed) * 1000.0 / total) / 10.0 : 0);
result.put("completeRate", total > 0 ? Math.round(completed * 1000.0 / total) / 10.0 : 0);
result.put("stopRate", total > 0 ? Math.round(stopped * 1000.0 / total) / 10.0 : 0);
return result;
}
}

View File

@@ -5,6 +5,7 @@ import com.healthlink.his.web.orderclosedloop.appservice.IOrderClosedLoopAppServ
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.*;
import java.util.Map;
@Tag(name = "医嘱闭环") @RestController @RequestMapping("/api/v1/order-closed-loop")
@@ -12,6 +13,7 @@ public class OrderClosedLoopController {
@Autowired private IOrderClosedLoopAppService appService;
@Operation(summary = "医嘱执行记录列表")
@PreAuthorize("@ss.hasPermi('inpatient:orderclosedloop:list')")
@GetMapping("/list")
public AjaxResult list(@RequestParam(required = false) String orderNo,
@RequestParam(required = false) String orderType,
@@ -22,12 +24,14 @@ public class OrderClosedLoopController {
}
@Operation(summary = "获取医嘱执行状态")
@PreAuthorize("@ss.hasPermi('inpatient:orderclosedloop:list')")
@GetMapping("/status/{orderId}")
public AjaxResult status(@PathVariable Long orderId) {
return AjaxResult.success(appService.getOrderStatus(orderId));
}
@Operation(summary = "执行医嘱")
@PreAuthorize("@ss.hasPermi('inpatient:orderclosedloop:edit')")
@PostMapping("/execute")
public AjaxResult execute(@RequestBody OrderExecuteRecord record) {
appService.executeOrder(record);
@@ -35,6 +39,7 @@ public class OrderClosedLoopController {
}
@Operation(summary = "完成医嘱")
@PreAuthorize("@ss.hasPermi('inpatient:orderclosedloop:edit')")
@PostMapping("/complete")
public AjaxResult complete(@RequestBody OrderExecuteRecord record) {
appService.completeOrder(record);
@@ -42,6 +47,7 @@ public class OrderClosedLoopController {
}
@Operation(summary = "取消医嘱")
@PreAuthorize("@ss.hasPermi('inpatient:orderclosedloop:edit')")
@PostMapping("/cancel")
public AjaxResult cancel(@RequestBody OrderExecuteRecord record) {
appService.cancelOrder(record);
@@ -49,6 +55,7 @@ public class OrderClosedLoopController {
}
@Operation(summary = "统计")
@PreAuthorize("@ss.hasPermi('inpatient:orderclosedloop:list')")
@GetMapping("/statistics")
public AjaxResult statistics(@RequestParam(required = false) String type,
@RequestParam(required = false) String groupBy,
@@ -58,9 +65,25 @@ public class OrderClosedLoopController {
}
@Operation(summary = "催办提醒")
@PreAuthorize("@ss.hasPermi('inpatient:orderclosedloop:edit')")
@PostMapping("/remind")
public AjaxResult remind(@RequestBody Map<String, Object> params) {
appService.remindOrder(params);
return AjaxResult.success("催办提醒已发送");
}
@Operation(summary = "医嘱执行追踪")
@PreAuthorize("@ss.hasPermi('inpatient:orderclosedloop:list')")
@GetMapping("/trace/{adviceId}")
public AjaxResult trace(@PathVariable Long adviceId) {
return AjaxResult.success(appService.getTrace(adviceId));
}
@Operation(summary = "执行统计")
@PreAuthorize("@ss.hasPermi('inpatient:orderclosedloop:list')")
@GetMapping("/statistics/summary")
public AjaxResult statisticsSummary(@RequestParam(required = false) String startDate,
@RequestParam(required = false) String endDate) {
return AjaxResult.success(appService.getStatisticsWithParams(startDate, endDate));
}
}

View File

@@ -0,0 +1,51 @@
CREATE TABLE blood_transfusion_record (
id BIGSERIAL PRIMARY KEY,
encounter_id BIGINT NOT NULL,
patient_id BIGINT NOT NULL,
advice_id BIGINT,
blood_type VARCHAR(10),
blood_component VARCHAR(50) NOT NULL,
blood_volume DECIMAL(10,2),
blood_unit VARCHAR(50),
cross_match_result VARCHAR(20),
indication TEXT,
doctor_id BIGINT NOT NULL,
doctor_name VARCHAR(50),
approval_status VARCHAR(20) DEFAULT 'PENDING',
approver_id BIGINT,
approver_name VARCHAR(50),
approve_time TIMESTAMP,
transfusion_start_time TIMESTAMP,
transfusion_end_time TIMESTAMP,
transfusion_nurse_id BIGINT,
transfusion_nurse_name VARCHAR(50),
pre_vital_signs TEXT,
during_vital_signs TEXT,
post_vital_signs TEXT,
adverse_reaction TEXT,
adverse_reaction_type VARCHAR(50),
status VARCHAR(20) DEFAULT 'DRAFT',
del_flag CHAR(1) DEFAULT '0',
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
create_by VARCHAR(64),
update_time TIMESTAMP,
update_by VARCHAR(64)
);
CREATE TABLE blood_transfusion_observation (
id BIGSERIAL PRIMARY KEY,
record_id BIGINT NOT NULL,
observation_time TIMESTAMP NOT NULL,
observation_phase VARCHAR(20),
temperature DECIMAL(4,1),
pulse INTEGER,
respiration INTEGER,
blood_pressure_high INTEGER,
blood_pressure_low INTEGER,
symptoms TEXT,
nurse_id BIGINT,
nurse_name VARCHAR(50),
del_flag CHAR(1) DEFAULT '0',
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
create_by VARCHAR(64)
);

View File

@@ -0,0 +1,15 @@
-- Bug #684: 手术状态下拉框有重复
-- 原因sys_dict_data 中 surgery_status 类型存在重复记录(每个 dict_value 有3条
-- 修复:删除重复记录,每个 dict_value 只保留 dict_code 最小的一条
DELETE FROM sys_dict_data
WHERE dict_code IN (
SELECT dict_code
FROM (
SELECT dict_code,
ROW_NUMBER() OVER (PARTITION BY dict_type, dict_value ORDER BY dict_code ASC) as rn
FROM sys_dict_data
WHERE dict_type = 'surgery_status'
) t
WHERE rn > 1
);

View File

@@ -0,0 +1,5 @@
-- 为 adm_patient_identifier 表添加 tenant_id + patient_id 联合索引
-- 加速按租户和患者查询的场景
CREATE INDEX IF NOT EXISTS idx_adm_patient_identifier_tenant_patient
ON healthlink_his.adm_patient_identifier USING btree (tenant_id, patient_id);

View File

@@ -4,4 +4,4 @@ ALTER TABLE prescription_intercept_log ADD COLUMN IF NOT EXISTS create_by VARCHA
ALTER TABLE prescription_intercept_log ADD COLUMN IF NOT EXISTS create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP;
ALTER TABLE prescription_intercept_log ADD COLUMN IF NOT EXISTS update_by VARCHAR(64) DEFAULT '';
ALTER TABLE prescription_intercept_log ADD COLUMN IF NOT EXISTS update_time TIMESTAMP;
ALTER TABLE prescription_intercept_log ADD COLUMN IF NOT EXISTS tenant_id BIGINT DEFAULT 1;
ALTER TABLE prescription_intercept_log ADD COLUMN IF NOT EXISTS tenant_id BIGINT DEFAULT 1;

View File

@@ -0,0 +1,30 @@
package com.healthlink.his.bloodtransfusion.domain;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.core.common.core.domain.HisBaseEntity;
import tools.jackson.databind.annotation.JsonSerialize;
import tools.jackson.databind.ser.std.ToStringSerializer;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.math.BigDecimal;
import java.util.Date;
@Data
@TableName("blood_transfusion_observation")
@EqualsAndHashCode(callSuper = true)
public class BloodTransfusionObservation extends HisBaseEntity {
@TableId(type = IdType.ASSIGN_ID)
@JsonSerialize(using = ToStringSerializer.class)
private Long id;
private Long recordId;
private Date observationTime;
private String observationPhase;
private BigDecimal temperature;
private Integer pulse;
private Integer respiration;
private Integer bloodPressureHigh;
private Integer bloodPressureLow;
private String symptoms;
private Long nurseId;
private String nurseName;
}

View File

@@ -0,0 +1,44 @@
package com.healthlink.his.bloodtransfusion.domain;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.core.common.core.domain.HisBaseEntity;
import tools.jackson.databind.annotation.JsonSerialize;
import tools.jackson.databind.ser.std.ToStringSerializer;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.math.BigDecimal;
import java.util.Date;
@Data
@TableName("blood_transfusion_record")
@EqualsAndHashCode(callSuper = true)
public class BloodTransfusionRecord extends HisBaseEntity {
@TableId(type = IdType.ASSIGN_ID)
@JsonSerialize(using = ToStringSerializer.class)
private Long id;
private Long encounterId;
private Long patientId;
private Long adviceId;
private String bloodType;
private String bloodComponent;
private BigDecimal bloodVolume;
private String bloodUnit;
private String crossMatchResult;
private String indication;
private Long doctorId;
private String doctorName;
private String approvalStatus;
private Long approverId;
private String approverName;
private Date approveTime;
private Date transfusionStartTime;
private Date transfusionEndTime;
private Long transfusionNurseId;
private String transfusionNurseName;
private String preVitalSigns;
private String duringVitalSigns;
private String postVitalSigns;
private String adverseReaction;
private String adverseReactionType;
private String status;
}

View File

@@ -0,0 +1,7 @@
package com.healthlink.his.bloodtransfusion.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.healthlink.his.bloodtransfusion.domain.BloodTransfusionObservation;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface BloodTransfusionObservationMapper extends BaseMapper<BloodTransfusionObservation> {
}

View File

@@ -0,0 +1,7 @@
package com.healthlink.his.bloodtransfusion.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.healthlink.his.bloodtransfusion.domain.BloodTransfusionRecord;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface BloodTransfusionRecordMapper extends BaseMapper<BloodTransfusionRecord> {
}

View File

@@ -0,0 +1,5 @@
package com.healthlink.his.bloodtransfusion.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.healthlink.his.bloodtransfusion.domain.BloodTransfusionObservation;
public interface IBloodTransfusionObservationService extends IService<BloodTransfusionObservation> {
}

View File

@@ -0,0 +1,5 @@
package com.healthlink.his.bloodtransfusion.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.healthlink.his.bloodtransfusion.domain.BloodTransfusionRecord;
public interface IBloodTransfusionRecordService extends IService<BloodTransfusionRecord> {
}

View File

@@ -0,0 +1,9 @@
package com.healthlink.his.bloodtransfusion.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.healthlink.his.bloodtransfusion.domain.BloodTransfusionObservation;
import com.healthlink.his.bloodtransfusion.mapper.BloodTransfusionObservationMapper;
import com.healthlink.his.bloodtransfusion.service.IBloodTransfusionObservationService;
import org.springframework.stereotype.Service;
@Service
public class BloodTransfusionObservationServiceImpl extends ServiceImpl<BloodTransfusionObservationMapper, BloodTransfusionObservation> implements IBloodTransfusionObservationService {
}

View File

@@ -0,0 +1,9 @@
package com.healthlink.his.bloodtransfusion.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.healthlink.his.bloodtransfusion.domain.BloodTransfusionRecord;
import com.healthlink.his.bloodtransfusion.mapper.BloodTransfusionRecordMapper;
import com.healthlink.his.bloodtransfusion.service.IBloodTransfusionRecordService;
import org.springframework.stereotype.Service;
@Service
public class BloodTransfusionRecordServiceImpl extends ServiceImpl<BloodTransfusionRecordMapper, BloodTransfusionRecord> implements IBloodTransfusionRecordService {
}

View File

@@ -32,6 +32,7 @@
"@vue/shared": "^3.5.25",
"@vueup/vue-quill": "^1.5.1",
"@vueuse/core": "^14.3.0",
"@vxe-ui/plugin-render-element": "^4.4.0",
"axios": "^1.16.1",
"china-division": "^2.7.0",
"cornerstone-core": "^2.6.1",

View File

@@ -0,0 +1,40 @@
import request from '@/utils/request'
export function applyBloodTransfusion(data) {
return request({
url: '/api/v1/blood-transfusion/apply',
method: 'post',
data: data
})
}
export function getBloodTransfusionPage(params) {
return request({
url: '/api/v1/blood-transfusion/page',
method: 'get',
params: params
})
}
export function approveBloodTransfusion(id, params) {
return request({
url: '/api/v1/blood-transfusion/approve/' + id,
method: 'put',
params: params
})
}
export function addObservation(data) {
return request({
url: '/api/v1/blood-transfusion/observe',
method: 'post',
data: data
})
}
export function getRecordDetail(id) {
return request({
url: '/api/v1/blood-transfusion/record/' + id,
method: 'get'
})
}

View File

@@ -34,3 +34,20 @@ export function getClosedLoopStatistics(params) {
params: params
})
}
// 医嘱执行追踪
export function getOrderExecuteTrace(adviceId) {
return request({
url: '/api/v1/order-closed-loop/trace/' + adviceId,
method: 'get'
})
}
// 执行统计(含科室/时间段)
export function getExecuteStatistics(params) {
return request({
url: '/api/v1/order-closed-loop/statistics/summary',
method: 'get',
params: params
})
}

View File

@@ -44,7 +44,7 @@
:row-config="{ keyField: '_etKey' }"
:scroll-x="{ enabled: true }"
:scroll-y="{ enabled: true }"
:show-overflow="true"
show-overflow="title"
v-bind="$attrs"
@checkbox-change="handleSelectionChange"
@checkbox-all="handleSelectionChange"

View File

@@ -2,6 +2,7 @@ import {createApp, nextTick} from 'vue';
import VxeUIAll from 'vxe-table';
import 'vxe-table/lib/style.css';
import { VxeTooltip } from 'vxe-pc-ui';
import Cookies from 'js-cookie';
// 导入 hiprint 并挂载到全局 window 对象
@@ -121,6 +122,11 @@ app.use(ElementPlus, {
// 支持 large̢̮̣ââ¬Å¡Ã¬Ã‚Ádefault̢̮̣ââ¬Å¡Ã¬Ã‚Ásmall
size: Cookies.get('size') || 'default',
});
// Register vxe-tooltip component required by vxe-table v4 for show-overflow="title"
VxeUIAll.VxeUI.component(VxeTooltip);
// Register element-plus render plugin for declarative editRender (ElSelect, ElInput etc.)
import VXETablePluginRenderElement from '@vxe-ui/plugin-render-element';
VxeUIAll.VxeUI.use(VXETablePluginRenderElement);
app.use(VxeUIAll);
// 导入公告帮助工具

View File

@@ -84,7 +84,7 @@
title="卫生机构"
width="200"
align="center"
show-overflow
show-overflow="title"
>
<template #default="scope">
<!-- ==忽略类型匹配string的"3"和number的3就能匹配上 -->
@@ -96,21 +96,21 @@
title="诊室名称"
width="160"
align="center"
show-overflow
show-overflow="title"
/>
<vxe-column
field="department"
title="科室名称"
width="160"
align="center"
show-overflow
show-overflow="title"
/>
<vxe-column
field="building"
title="诊室楼号"
width="120"
align="center"
show-overflow
show-overflow="title"
/>
<vxe-column
field="floor"
@@ -141,7 +141,7 @@
title="备注"
min-width="100"
align="center"
show-overflow
show-overflow="title"
/>
<vxe-column
field="void"
@@ -159,7 +159,7 @@
title="操作人"
width="120"
align="center"
show-overflow
show-overflow="title"
>
<template #default="scope">
{{ scope.row.updateBy || scope.row.createBy || '系统默认' }}

View File

@@ -101,14 +101,14 @@
title="所属机构"
min-width="150"
align="center"
show-overflow
show-overflow="title"
/>
<vxe-column
field="department"
title="科室名称"
min-width="150"
align="center"
show-overflow
show-overflow="title"
/>
<vxe-column
field="morningStart"
@@ -161,7 +161,7 @@
title="操作人"
min-width="100"
align="center"
show-overflow
show-overflow="title"
/>
<vxe-column
width="120"

View File

@@ -19,7 +19,7 @@
<vxe-table :data="tableData" border height="calc(100vh - 320px)" v-loading="loading">
<vxe-column type="seq" title="序号" width="60" />
<vxe-column field="conditionCode" title="编码" width="120" />
<vxe-column field="name" title="诊断名称" min-width="200" show-overflow />
<vxe-column field="name" title="诊断名称" min-width="200" show-overflow="title" />
<vxe-column field="typeCode" title="类型" width="100" />
<vxe-column field="status" title="状态" width="80" align="center">
<template #default="{ row }">

View File

@@ -19,7 +19,7 @@
<vxe-table :data="tableData" border height="calc(100vh - 320px)" v-loading="loading">
<vxe-column type="seq" title="序号" width="60" />
<vxe-column field="conditionCode" title="编码" width="120" />
<vxe-column field="name" title="项目名称" min-width="200" show-overflow />
<vxe-column field="name" title="项目名称" min-width="200" show-overflow="title" />
<vxe-column field="typeCode" title="类型" width="100" />
<vxe-column field="status" title="状态" width="80" align="center">
<template #default="{ row }">

View File

@@ -73,7 +73,7 @@
title="诊疗目录"
width="150"
align="center"
:show-overflow="true"
show-overflow="title"
>
<template #default="scope">
<el-select
@@ -95,7 +95,7 @@
<vxe-column
title="项目名称"
align="center"
:show-overflow="true"
show-overflow="title"
>
<template #default="scope">
<el-select
@@ -123,7 +123,7 @@
title="开始时间"
align="center"
field="startTime"
:show-overflow="true"
show-overflow="title"
>
<template #default="scope">
<el-time-picker
@@ -140,7 +140,7 @@
title="结束时间"
align="center"
field="endTime"
show-overflow
show-overflow="title"
>
<template #default="scope">
<el-time-picker

View File

@@ -191,19 +191,19 @@
title="科室位置"
align="center"
field="location"
show-overflow
show-overflow="title"
/>
<vxe-column
title="科室简介"
align="center"
field="intro"
show-overflow
show-overflow="title"
/>
<vxe-column
title="备注"
align="center"
field="remark"
show-overflow
show-overflow="title"
/>
<vxe-column
title="状态"

View File

@@ -57,7 +57,7 @@
align="center"
field="name"
width="300"
:show-overflow="true"
show-overflow="title"
>
<template #default="scope">
<div style="display: flex; align-items: center; justify-content: center">
@@ -84,7 +84,7 @@
title="项目类型"
align="center"
field="itemCode"
:show-overflow="true"
show-overflow="title"
width="300"
>
<template #default="scope">
@@ -113,7 +113,7 @@
title="药品类别"
align="center"
field="pyStr"
:show-overflow="true"
show-overflow="title"
width="300"
>
<template #default="scope">
@@ -150,7 +150,7 @@
title="开始时间"
align="center"
field="wbStr"
:show-overflow="true"
show-overflow="title"
width="300"
>
<template #default="scope">
@@ -167,7 +167,7 @@
title="结束时间"
align="center"
field="categoryCode_dictText"
:show-overflow="true"
show-overflow="title"
width="300"
>
<template #default="scope">
@@ -180,7 +180,7 @@
</template>
</vxe-column>
<!-- <vxe-column title="备注" align="center" key="typeEnum_enumText" field="typeEnum_enumText"
:show-overflow="true" width="300">
show-overflow="title" width="300">
<template #default="scope">
<el-input v-model="scope.row.detailJson" placeholder="" />
</template>

View File

@@ -118,21 +118,21 @@
title="名称"
align="center"
field="name"
:show-overflow="true"
show-overflow="title"
/>
<vxe-column
key="pyStr"
title="拼音助记码"
align="center"
field="pyStr"
:show-overflow="true"
show-overflow="title"
/>
<vxe-column
key="typeEnum_enumText"
title="类型 "
align="center"
field="typeEnum_enumText"
:show-overflow="true"
show-overflow="title"
/>
<vxe-column
key="address"

View File

@@ -19,7 +19,7 @@
<vxe-table :data="tableData" border height="calc(100vh - 320px)" v-loading="loading">
<vxe-column type="seq" title="序号" width="60" />
<vxe-column field="conditionCode" title="编码" width="120" />
<vxe-column field="name" title="处方名称" min-width="200" show-overflow />
<vxe-column field="name" title="处方名称" min-width="200" show-overflow="title" />
<vxe-column field="typeCode" title="类型" width="100" />
<vxe-column field="status" title="状态" width="80" align="center">
<template #default="{ row }">

View File

@@ -132,21 +132,21 @@
title="提供部门"
align="center"
field="offeredOrgId_dictText"
:show-overflow="true"
show-overflow="title"
/>
<vxe-column
key="categoryCode_dictText"
title="服务分类"
align="center"
field="categoryCode_dictText"
:show-overflow="true"
show-overflow="title"
/>
<vxe-column
key="typeCode_dictText"
title="服务类型 "
align="center"
field="typeCode_dictText"
:show-overflow="true"
show-overflow="title"
/>
<vxe-column
key="specialtyCode_dictText"

View File

@@ -170,7 +170,7 @@
title="编码"
align="center"
field="busNo"
:show-overflow="true"
show-overflow="title"
width="150"
/>
<vxe-column
@@ -178,7 +178,7 @@
title="器材名称"
align="center"
field="name"
:show-overflow="true"
show-overflow="title"
width="100"
/>
<vxe-column
@@ -187,21 +187,21 @@
align="center"
field="size"
width="100"
:show-overflow="true"
show-overflow="title"
/>
<!-- <vxe-column
title="拼音"
align="center"
key="pyStr"
field="pyStr"
:show-overflow="true"
show-overflow="title"
/> -->
<vxe-column
key="categoryCode_dictText"
title="器材分类"
align="center"
field="categoryCode_dictText"
:show-overflow="true"
show-overflow="title"
width="100"
/>
<!-- <vxe-column
@@ -209,7 +209,7 @@
align="center"
key="typeCode_dictText"
field="typeCode_dictText"
:show-overflow="true"
show-overflow="title"
width="50"
/> -->
<vxe-column
@@ -217,7 +217,7 @@
title="包装单位"
align="center"
field="unitCode_dictText"
:show-overflow="true"
show-overflow="title"
width="100"
/>
<vxe-column
@@ -225,7 +225,7 @@
title="拆零比"
align="center"
field="partPercent"
:show-overflow="true"
show-overflow="title"
>
<template #default="scope">
{{
@@ -241,7 +241,7 @@
title="最小使用单位"
align="center"
field="minUnitCode_dictText"
:show-overflow="true"
show-overflow="title"
width="100"
/>
<!-- <vxe-column
@@ -249,21 +249,21 @@
align="center"
key="orgId_dictText"
field="orgId_dictText"
:show-overflow="true"
show-overflow="title"
/>
<vxe-column
title="所在位置"
align="center"
key="locationId_dictText"
field="locationId_dictText"
:show-overflow="true"
show-overflow="title"
/> -->
<!-- <vxe-column
title="产品型号"
align="center"
key="modelNumber"
field="modelNumber"
:show-overflow="true"
show-overflow="title"
/> -->
<vxe-column
@@ -271,7 +271,7 @@
title="销售单位"
align="center"
field="salesUnitCode_dictText"
:show-overflow="true"
show-overflow="title"
width="100"
/>
<!-- <vxe-column
@@ -279,14 +279,14 @@
align="center"
key="approvalNumber"
field="approvalNumber"
:show-overflow="true"
show-overflow="title"
/> -->
<!-- <vxe-column
title="医保标记"
align="center"
key="ybFlag_enumText"
field="ybFlag_enumText"
:show-overflow="true"
show-overflow="title"
width="110"
/> -->
<vxe-column
@@ -294,7 +294,7 @@
title="医保编码"
align="center"
field="ybNo"
:show-overflow="true"
show-overflow="title"
width="110"
/>
<vxe-column
@@ -302,7 +302,7 @@
title="医药机构目录编码"
align="center"
field="ybOrgNo"
:show-overflow="true"
show-overflow="title"
width="130"
/>
<!-- <vxe-column
@@ -310,7 +310,7 @@
align="center"
key="ybMatchFlag_enumText"
field="ybMatchFlag_enumText"
:show-overflow="true"
show-overflow="title"
width="105"
/> -->
<vxe-column
@@ -318,7 +318,7 @@
title="状态"
align="center"
field="statusEnum_enumText"
:show-overflow="true"
show-overflow="title"
width="90"
/>
<!-- <vxe-column
@@ -326,7 +326,7 @@
align="center"
key="manufacturerId"
field="manufacturerId"
:show-overflow="true"
show-overflow="title"
width="90"
/> -->
<vxe-column
@@ -334,7 +334,7 @@
title="生产厂家"
align="center"
field="manufacturerText"
:show-overflow="true"
show-overflow="title"
width="200"
/>
<!-- <vxe-column
@@ -342,7 +342,7 @@
align="center"
key="supplyId_dictText"
field="supplyId_dictText"
:show-overflow="true"
show-overflow="title"
width="110"
/>
<vxe-column
@@ -350,14 +350,14 @@
align="center"
key="description"
field="description"
:show-overflow="true"
show-overflow="title"
/>
<vxe-column
title="适用范围"
align="center"
key="jurisdiction"
field="jurisdiction"
:show-overflow="true"
show-overflow="title"
width="120"
/>
<vxe-column
@@ -365,7 +365,7 @@
align="center"
key="version"
field="version"
:show-overflow="true"
show-overflow="title"
width="120"
/>
<vxe-column
@@ -373,14 +373,14 @@
align="center"
key="substanceText"
field="substanceText"
:show-overflow="true"
show-overflow="title"
/> -->
<!-- <vxe-column
title="过敏标记"
align="center"
key="allergenFlag_enumText"
field="allergenFlag_enumText"
:show-overflow="true"
show-overflow="title"
width="90"
/> -->
<vxe-column
@@ -388,7 +388,7 @@
title="售价"
align="center"
field="retailPrice"
:show-overflow="true"
show-overflow="title"
width="90"
/>
<vxe-column
@@ -396,7 +396,7 @@
title="财务类别"
align="center"
field="itemTypeCode_dictText"
:show-overflow="true"
show-overflow="title"
width="90"
/>
<vxe-column
@@ -404,7 +404,7 @@
title="高值器材标志"
align="center"
field="hvcmFlag_enumText"
:show-overflow="true"
show-overflow="title"
width="120"
/>
<!-- <vxe-column
@@ -412,7 +412,7 @@
align="center"
key="ybType_dictText"
field="ybType_dictText"
:show-overflow="true"
show-overflow="title"
width="90"
/> -->
<vxe-column

View File

@@ -236,7 +236,7 @@
title="编码"
align="center"
field="busNo"
:show-overflow="true"
show-overflow="title"
width="200"
/>
<vxe-column
@@ -244,7 +244,7 @@
title="项目名称"
align="center"
field="name"
:show-overflow="true"
show-overflow="title"
width="200"
/>
@@ -253,7 +253,7 @@
title="目录类别"
align="center"
field="categoryCode_dictText"
:show-overflow="true"
show-overflow="title"
width="100"
/>
<vxe-column
@@ -261,7 +261,7 @@
title="售价"
align="center"
field="retailPrice"
:show-overflow="true"
show-overflow="title"
width="100"
/>
<vxe-column
@@ -269,7 +269,7 @@
title="财务类别"
align="center"
field="itemTypeCode_dictText"
:show-overflow="true"
show-overflow="title"
width="100"
/>
<vxe-column
@@ -277,28 +277,28 @@
title="使用单位"
align="center"
field="permittedUnitCode_dictText"
:show-overflow="true"
show-overflow="title"
/>
<vxe-column
key="ybNo"
title="医保编码"
align="center"
field="ybNo"
:show-overflow="true"
show-overflow="title"
/>
<vxe-column
key="statusEnum_enumText"
title="状态"
align="center"
field="statusEnum_enumText"
:show-overflow="true"
show-overflow="title"
/>
<vxe-column
key="pricingFlag_enumText"
title="划价标记"
align="center"
field="pricingFlag_enumText"
:show-overflow="true"
show-overflow="title"
width="100"
>
<template #default="scope">

View File

@@ -167,42 +167,42 @@
title="名称"
align="center"
field="name"
:show-overflow="true"
show-overflow="title"
/>
<vxe-column
key="sourceEnum_enumText"
title="疾病分类"
align="center"
field="sourceEnum_enumText"
:show-overflow="true"
show-overflow="title"
/>
<!-- <vxe-column
title="拼音助记码"
align="center"
key="pyStr"
field="pyStr"
:show-overflow="true"
show-overflow="title"
/> -->
<vxe-column
key="typeCode_dictText"
title="类型"
align="center"
field="typeCode_dictText"
:show-overflow="true"
show-overflow="title"
/>
<vxe-column
key="reportTypeCode_dictText"
title="报卡类型"
align="center"
field="reportTypeCode_dictText"
:show-overflow="true"
show-overflow="title"
/>
<vxe-column
key="ybNo"
title="医保编码 "
align="center"
field="ybNo"
:show-overflow="true"
show-overflow="title"
/>
<!-- <vxe-column
title="医保标记"

View File

@@ -218,7 +218,7 @@
title="药品编号"
align="center"
field="busNo"
:show-overflow="true"
show-overflow="title"
min-width="90"
width="200px"
/>
@@ -227,7 +227,7 @@
title="药品名称"
align="center"
field="name"
:show-overflow="true"
show-overflow="title"
min-width="110"
width="200px"
sortable
@@ -238,7 +238,7 @@
title="规格"
align="center"
field="totalVolume"
:show-overflow="true"
show-overflow="title"
min-width="200px"
width="200px"
/>
@@ -247,7 +247,7 @@
title="药品状态"
align="center"
field="statusEnum_enumText"
:show-overflow="true"
show-overflow="title"
>
<template #default="scope">
<el-tag
@@ -271,7 +271,7 @@
title="药品分类"
align="center"
field="categoryCode_dictText"
:show-overflow="true"
show-overflow="title"
width="90"
/>
<!-- <vxe-column
@@ -279,14 +279,14 @@
align="center"
key="orgId_dictText"
field="orgId_dictText"
:show-overflow="true"
show-overflow="title"
/> -->
<!-- <vxe-column
title="采购入库位置"
align="center"
key="locationId_dictText"
field="locationId_dictText"
:show-overflow="true"
show-overflow="title"
/> -->
<vxe-column
@@ -294,7 +294,7 @@
title="医保编码"
align="center"
field="ybNo"
:show-overflow="true"
show-overflow="title"
width="90"
/>
<vxe-column
@@ -302,21 +302,21 @@
title="医保是否对码"
align="center"
field="ybMatchFlag_enumText"
:show-overflow="true"
show-overflow="title"
/>
<vxe-column
key="drug69Code"
title="69"
align="center"
field="drug69Code"
:show-overflow="true"
show-overflow="title"
/>
<!-- <vxe-column
title="医保上传"
align="center"
key="ybNo"
field="ybNo"
:show-overflow="true"
show-overflow="title"
width="90"
/> -->
<vxe-column
@@ -324,7 +324,7 @@
title="采购价"
align="center"
field="purchasePrice"
:show-overflow="true"
show-overflow="title"
width="90"
/>
<vxe-column
@@ -332,7 +332,7 @@
title="售价"
align="center"
field="retailPrice"
:show-overflow="true"
show-overflow="title"
width="90"
/>
<vxe-column

View File

@@ -86,7 +86,7 @@
key="glNo"
field="glNo"
title="国临版疾病编码"
:show-overflow="true"
show-overflow="title"
align="center"
width="180"
/>
@@ -95,7 +95,7 @@
key="glName"
field="glName"
title="国临版疾病名称"
:show-overflow="true"
show-overflow="title"
align="center"
min-width="200"
/>
@@ -104,7 +104,7 @@
key="icd10No"
field="icd10No"
title="医保版疾病编码"
:show-overflow="true"
show-overflow="title"
align="center"
width="180"
/>
@@ -113,7 +113,7 @@
key="icd10Name"
field="icd10Name"
title="医保版疾病名称"
:show-overflow="true"
show-overflow="title"
align="center"
min-width="200"
/>

View File

@@ -107,38 +107,38 @@
title="患者姓名"
align="center"
field="patientName"
:show-overflow="true"
show-overflow="title"
/>
<vxe-column
title="支付状态"
align="center"
field="statusEnum_dictText"
:show-overflow="true"
show-overflow="title"
/>
<vxe-column
title="费用类型"
align="center"
field="paymentEnum_dictText"
:show-overflow="true"
show-overflow="title"
/>
<vxe-column
title="医保结算Id"
align="center"
field="ybSettleIds"
:show-overflow="true"
show-overflow="title"
/>
<vxe-column
title="收费流水号"
align="center"
field="paymentNo"
width="280"
:show-overflow="true"
show-overflow="title"
/>
<vxe-column
title="发票号"
align="center"
field="invoiceNo"
:show-overflow="true"
show-overflow="title"
/>
<vxe-column
title="结算金额"
@@ -146,7 +146,7 @@
field="tenderedAmount"
header-align="center"
width="100"
:show-overflow="true"
show-overflow="title"
>
<template #default="scope">
<span>{{ scope.row.tenderedAmount + ' 元' }}</span>
@@ -158,7 +158,7 @@
field="displayAmount"
header-align="center"
width="100"
:show-overflow="true"
show-overflow="title"
>
<template #default="scope">
<span>{{ scope.row.displayAmount + ' 元' }}</span>
@@ -170,7 +170,7 @@
align="center"
field="billDate"
:show-overflow="true"
show-overflow="title"
>
<template #default="scope">
<span>{{ parseTime(scope.row.billDate) }}</span>
@@ -180,20 +180,20 @@
title="收款人"
align="center"
field="entererName"
:show-overflow="true"
show-overflow="title"
/>
<!-- <vxe-column title="医生" align="center" field="paymentEnum_enumText" /> -->
<vxe-column
title="支付结果"
align="center"
field="outcomeEnum_dictText"
:show-overflow="true"
show-overflow="title"
/>
<vxe-column
title="打印次数"
align="center"
field="printCount"
:show-overflow="true"
show-overflow="title"
/>
<vxe-column
title="操作"
@@ -261,25 +261,25 @@
title="支付类型"
align="center"
field="payEnum_dictText"
:show-overflow="true"
show-overflow="title"
/>
<vxe-column
title="金额"
align="center"
field="amount"
:show-overflow="true"
show-overflow="title"
/>
<vxe-column
title="找零"
align="center"
field="returnAmount"
:show-overflow="true"
show-overflow="title"
/>
<vxe-column
title="交款"
align="center"
field="chargeAmount"
:show-overflow="true"
show-overflow="title"
/>
</vxe-table>
</el-dialog>

View File

@@ -22,28 +22,28 @@
title="患者姓名"
align="center"
field="name"
:show-overflow="true"
show-overflow="title"
/>
<vxe-column
key="genderEnum_enumText"
title="性别"
align="center"
field="genderEnum_enumText"
:show-overflow="true"
show-overflow="title"
/>
<vxe-column
key="idCard"
title="身份证号"
align="center"
field="idCard"
:show-overflow="true"
show-overflow="title"
/>
<vxe-column
key="phone"
title="电话"
align="center"
field="phone"
:show-overflow="true"
show-overflow="title"
width="100"
/>
<vxe-column
@@ -51,14 +51,14 @@
title="生日"
align="center"
field="birthDate"
:show-overflow="true"
show-overflow="title"
width="50"
/>
<vxe-column
key="age"
title="年龄"
align="center"
:show-overflow="true"
show-overflow="title"
>
<template #default="scope">
{{ scope.row.age ? `${scope.row.age}` : '-' }}

View File

@@ -654,7 +654,7 @@
align="center"
key="organizationId"
field="organizationId"
:show-overflow="true"
show-overflow="title"
/> -->
<vxe-column
title=""
@@ -713,7 +713,7 @@
title="科室名称"
align="center"
field="organizationName"
:show-overflow="true"
show-overflow="title"
:min-width="120"
/>
<vxe-column
@@ -721,7 +721,7 @@
title="*挂号类型 "
align="center"
field="healthcareName"
:show-overflow="true"
show-overflow="title"
:min-width="140"
>
<template #default="scope">

View File

@@ -41,13 +41,13 @@
title="患者姓名"
align="center"
field="patientName"
:show-overflow="true"
show-overflow="title"
/>
<vxe-column
title="支付单号"
align="center"
field="paymentBusNo"
:show-overflow="true"
show-overflow="title"
/>
<vxe-column
title="交易金额(元)"
@@ -55,25 +55,25 @@
field="txnAmt"
header-align="center"
width="100"
:show-overflow="true"
show-overflow="title"
/>
<vxe-column
title="交易类型"
align="center"
field="tranType"
:show-overflow="true"
show-overflow="title"
/>
<vxe-column
title="支付方式"
align="center"
field="payType"
:show-overflow="true"
show-overflow="title"
/>
<vxe-column
title="交易时间"
align="center"
field="txnTime"
:show-overflow="true"
show-overflow="title"
>
<template #default="scope">
<span>{{ parseTime(scope.row.txnTime) }}</span>
@@ -83,37 +83,37 @@
title="原交易类型"
align="center"
field="orgTranType"
:show-overflow="true"
show-overflow="title"
/>
<vxe-column
title="原交易类型"
align="center"
field="orgTranType"
:show-overflow="true"
show-overflow="title"
/>
<vxe-column
title="第三方优惠说明"
align="center"
field="otherMsg"
:show-overflow="true"
show-overflow="title"
/>
<vxe-column
title="错误信息"
align="center"
field="errMsg"
:show-overflow="true"
show-overflow="title"
/>
<vxe-column
title="查询结果"
align="center"
field="queryResult"
:show-overflow="true"
show-overflow="title"
/>
<vxe-column
title="查询结果说明"
align="center"
field="queryResultMsg"
:show-overflow="true"
show-overflow="title"
/>
<vxe-column
title="操作"

View File

@@ -98,11 +98,11 @@
max-height="calc(100vh - 420px)"
@cell-click="handleDetail"
>
<vxe-column field="billNo" title="账单号" align="center" width="180" show-overflow />
<vxe-column field="billNo" title="账单号" align="center" width="180" show-overflow="title" />
<vxe-column field="patientName" title="患者姓名" align="center" width="110" />
<vxe-column field="genderEnum_enumText" title="性别" align="center" width="70" />
<vxe-column field="age" title="年龄" align="center" width="60" />
<vxe-column field="encounterNo" title="门诊号" align="center" width="140" show-overflow />
<vxe-column field="encounterNo" title="门诊号" align="center" width="140" show-overflow="title" />
<vxe-column field="billType_dictText" title="收费类型" align="center" width="100" />
<vxe-column field="totalAmount" title="收费金额" align="right" width="110">
<template #default="scope">
@@ -183,9 +183,9 @@
<div class="item-title">费用明细</div>
<vxe-table :data="billDetail.items" border size="small">
<vxe-column type="index" title="序号" align="center" width="60" />
<vxe-column field="itemName" title="项目名称" align="left" min-width="180" show-overflow />
<vxe-column field="itemName" title="项目名称" align="left" min-width="180" show-overflow="title" />
<vxe-column field="itemType_dictText" title="类型" align="center" width="100" />
<vxe-column field="specification" title="规格" align="center" width="120" show-overflow />
<vxe-column field="specification" title="规格" align="center" width="120" show-overflow="title" />
<vxe-column field="quantity" title="数量" align="center" width="80" />
<vxe-column field="unitPrice" title="单价" align="right" width="100">
<template #default="scope">

View File

@@ -47,10 +47,10 @@
height="calc(100vh - 360px)"
@cell-click="handlePatientClick"
>
<vxe-column field="patientName" title="姓名" align="center" width="110" show-overflow />
<vxe-column field="patientName" title="姓名" align="center" width="110" show-overflow="title" />
<vxe-column field="genderEnum_enumText" title="性别" align="center" width="60" />
<vxe-column field="age" title="年龄" align="center" width="50" />
<vxe-column field="encounterNo" title="门诊号" align="center" width="140" show-overflow />
<vxe-column field="encounterNo" title="门诊号" align="center" width="140" show-overflow="title" />
<vxe-column title="就诊日期" align="center" width="110">
<template #default="scope">
{{ scope.row.receptionTime ? formatDateStr(scope.row.receptionTime, 'YYYY-MM-DD') : '-' }}
@@ -109,9 +109,9 @@
@select="handleSelectionChange"
>
<vxe-column type="checkbox" width="55" align="center" />
<vxe-column field="itemName" title="项目名称" align="center" show-overflow min-width="180" />
<vxe-column field="itemName" title="项目名称" align="center" show-overflow="title" min-width="180" />
<vxe-column field="itemType_dictText" title="类型" align="center" width="100" />
<vxe-column field="specification" title="规格" align="center" width="120" show-overflow />
<vxe-column field="specification" title="规格" align="center" width="120" show-overflow="title" />
<vxe-column field="quantity" title="数量" align="center" width="80" />
<vxe-column field="unitPrice" title="单价" align="right" width="100">
<template #default="scope">
@@ -129,7 +129,7 @@
</template>
</vxe-column>
<vxe-column field="doctorName" title="开单医生" align="center" width="110" />
<vxe-column field="deptName" title="科室" align="center" width="130" show-overflow />
<vxe-column field="deptName" title="科室" align="center" width="130" show-overflow="title" />
<vxe-column title="退费状态" align="center" width="90">
<template #default="scope">
<el-tag v-if="scope.row.refundStatus === '0'" type="success" size="small">正常</el-tag>

View File

@@ -60,21 +60,21 @@
title="处方号"
align="center"
field="prescriptionNo"
:show-overflow="true"
show-overflow="title"
/>
<vxe-column
key="requesterId_dictText"
title="请求人"
align="center"
field="requesterId_dictText"
:show-overflow="true"
show-overflow="title"
/>
<vxe-column
key="requestTime"
title="请求时间"
align="center"
field="requestTime"
:show-overflow="true"
show-overflow="title"
width="160px"
>
<template #default="scope">
@@ -86,21 +86,21 @@
title="医嘱名称"
align="center"
field="adviceName"
:show-overflow="true"
show-overflow="title"
/>
<vxe-column
key="volume"
title="规格"
align="center"
field="volume"
:show-overflow="true"
show-overflow="title"
/>
<vxe-column
key="lotNumber"
title="产品批号"
align="center"
field="lotNumber"
:show-overflow="true"
show-overflow="title"
/>
<vxe-column
title="请求数量"
@@ -118,7 +118,7 @@
align="center"
key="unitCode_dictText"
field="unitCode_dictText"
:show-overflow="true"
show-overflow="title"
/> -->
<vxe-column
title="请求状态"
@@ -152,14 +152,14 @@
title="用法"
align="center"
field="methodCode_dictText"
:show-overflow="true"
show-overflow="title"
/>
<vxe-column
key="rateCode_dictText"
title="使用频次"
align="center"
field="rateCode_dictText"
:show-overflow="true"
show-overflow="title"
/>
<vxe-column
title="单次剂量"
@@ -190,7 +190,7 @@
title="收费状态"
align="center"
field="chargeStatus_enumText"
:show-overflow="true"
show-overflow="title"
/>
<vxe-column
title="收费状态"
@@ -236,14 +236,14 @@
title="用药天数"
align="center"
field="dispensePerDuration"
:show-overflow="true"
show-overflow="title"
/>
<vxe-column
key="conditionDefinitionName"
title="诊断定义名称"
align="center"
field="conditionDefinitionName"
:show-overflow="true"
show-overflow="title"
/>
</vxe-table>
<pagination

View File

@@ -67,28 +67,28 @@
title="处方号"
align="center"
field="prescriptionNo"
:show-overflow="true"
show-overflow="title"
/>
<vxe-column
key="patientName"
title="患者"
align="center"
field="patientName"
:show-overflow="true"
show-overflow="title"
/>
<vxe-column
key="conditionDefinitionName"
title="疾病诊断"
align="center"
field="conditionDefinitionName"
:show-overflow="true"
show-overflow="title"
/>
<vxe-column
key="requestTime"
title="修改时间"
align="center"
field="requestTime"
:show-overflow="true"
show-overflow="title"
>
<template #default="scope">
<span>{{ parseTime(scope.row.requestTime) }}</span>
@@ -99,7 +99,7 @@
title="开方医生"
align="center"
field="practitionerName"
:show-overflow="true"
show-overflow="title"
/>
<vxe-column

View File

@@ -79,53 +79,53 @@
title="科室"
align="center"
field="orgName"
:show-overflow="true"
show-overflow="title"
/>
<vxe-column
title="人次"
align="center"
field="personCnt"
:show-overflow="true"
show-overflow="title"
/>
<vxe-column
title="应收金额"
align="center"
field="amount"
:show-overflow="true"
show-overflow="title"
/>
<vxe-column
title="实收金额"
align="center"
field="receivedAmount"
width="280"
:show-overflow="true"
show-overflow="title"
/>
<vxe-column
title="挂号费"
align="center"
field="registrationFee"
:show-overflow="true"
show-overflow="title"
/>
<vxe-column
title="处置费"
align="center"
field="serviceFee"
:show-overflow="true"
show-overflow="title"
/>
<vxe-column
title="药品费"
align="center"
field="medFee"
:show-overflow="true"
show-overflow="title"
/>
<!-- <vxe-column title="优惠金额" align="center" field="entererName" :show-overflow="true"/> -->
<!-- <vxe-column title="日结" align="center" field="outcomeEnum_dictText" :show-overflow="true"/> -->
<!-- <vxe-column title="月累计" align="center" field="printCount" :show-overflow="true"/> -->
<!-- <vxe-column title="优惠金额" align="center" field="entererName" show-overflow="title"/> -->
<!-- <vxe-column title="日结" align="center" field="outcomeEnum_dictText" show-overflow="title"/> -->
<!-- <vxe-column title="月累计" align="center" field="printCount" show-overflow="title"/> -->
<vxe-column
title="备注"
align="center"
field="printCount"
:show-overflow="true"
show-overflow="title"
/>
</vxe-table>
<pagination

View File

@@ -44,12 +44,12 @@
max-height="calc(100vh - 320px)"
@cell-click="handleLabDetail"
>
<vxe-column field="reportNo" title="报告号" align="center" width="160" show-overflow />
<vxe-column field="reportNo" title="报告号" align="center" width="160" show-overflow="title" />
<vxe-column field="patientName" title="患者姓名" align="center" width="110" />
<vxe-column field="genderEnum_enumText" title="性别" align="center" width="70" />
<vxe-column field="age" title="年龄" align="center" width="60" />
<vxe-column field="encounterNo" title="门诊号" align="center" width="140" show-overflow />
<vxe-column field="itemName" title="检验项目" align="left" min-width="200" show-overflow />
<vxe-column field="encounterNo" title="门诊号" align="center" width="140" show-overflow="title" />
<vxe-column field="itemName" title="检验项目" align="left" min-width="200" show-overflow="title" />
<vxe-column field="sampleType" title="标本类型" align="center" width="100" />
<vxe-column field="reportStatus_dictText" title="报告状态" align="center" width="100" />
<vxe-column field="abnormalFlag" title="异常标记" align="center" width="90">
@@ -90,13 +90,13 @@
max-height="calc(100vh - 320px)"
@cell-click="handleExamDetail"
>
<vxe-column field="reportNo" title="报告号" align="center" width="160" show-overflow />
<vxe-column field="reportNo" title="报告号" align="center" width="160" show-overflow="title" />
<vxe-column field="patientName" title="患者姓名" align="center" width="110" />
<vxe-column field="genderEnum_enumText" title="性别" align="center" width="70" />
<vxe-column field="age" title="年龄" align="center" width="60" />
<vxe-column field="encounterNo" title="门诊号" align="center" width="140" show-overflow />
<vxe-column field="examItemName" title="检查项目" align="left" min-width="200" show-overflow />
<vxe-column field="examPart" title="检查部位" align="center" width="120" show-overflow />
<vxe-column field="encounterNo" title="门诊号" align="center" width="140" show-overflow="title" />
<vxe-column field="examItemName" title="检查项目" align="left" min-width="200" show-overflow="title" />
<vxe-column field="examPart" title="检查部位" align="center" width="120" show-overflow="title" />
<vxe-column field="reportStatus_dictText" title="报告状态" align="center" width="100" />
<vxe-column field="reportDoctor" title="报告医生" align="center" width="110" />
<vxe-column title="报告时间" align="center" width="160">
@@ -146,7 +146,7 @@
<div class="section-title">检验结果</div>
<vxe-table :data="labDetail.resultItems" border size="small" max-height="400">
<vxe-column type="index" title="序号" align="center" width="60" />
<vxe-column field="itemName" title="项目名称" align="left" min-width="160" show-overflow />
<vxe-column field="itemName" title="项目名称" align="left" min-width="160" show-overflow="title" />
<vxe-column field="resultValue" title="结果" align="center" width="120">
<template #default="scope">
<span :class="scope.row.abnormalFlag === '1' ? 'abnormal' : ''">{{ scope.row.resultValue }}</span>
@@ -162,7 +162,7 @@
<span v-else>-</span>
</template>
</vxe-column>
<vxe-column field="method" title="检测方法" align="center" width="120" show-overflow />
<vxe-column field="method" title="检测方法" align="center" width="120" show-overflow="title" />
</vxe-table>
</div>
<div v-if="labDetail.conclusion" class="conclusion">

View File

@@ -67,15 +67,15 @@
max-height="calc(100vh - 280px)"
@cell-click="handleDetail"
>
<vxe-column field="orderNo" title="医嘱号" align="center" width="160" show-overflow />
<vxe-column field="orderNo" title="医嘱号" align="center" width="160" show-overflow="title" />
<vxe-column field="patientName" title="患者姓名" align="center" width="110" />
<vxe-column field="genderEnum_enumText" title="性别" align="center" width="70" />
<vxe-column field="age" title="年龄" align="center" width="60" />
<vxe-column field="encounterNo" title="门诊号" align="center" width="140" show-overflow />
<vxe-column field="encounterNo" title="门诊号" align="center" width="140" show-overflow="title" />
<vxe-column field="orderType_dictText" title="医嘱类型" align="center" width="100" />
<vxe-column field="orderContent" title="医嘱内容" align="left" min-width="220" show-overflow />
<vxe-column field="orderContent" title="医嘱内容" align="left" min-width="220" show-overflow="title" />
<vxe-column field="doctorName" title="开嘱医生" align="center" width="110" />
<vxe-column field="deptName" title="科室" align="center" width="130" show-overflow />
<vxe-column field="deptName" title="科室" align="center" width="130" show-overflow="title" />
<vxe-column field="orderStatus_dictText" title="状态" align="center" width="90">
<template #default="scope">
<el-tag v-if="scope.row.orderStatus === 'NEW'" type="primary" size="small">新开</el-tag>
@@ -145,13 +145,13 @@
<div class="section-title">医嘱明细项目</div>
<vxe-table :data="orderDetail.items" border size="small">
<vxe-column type="index" title="序号" align="center" width="60" />
<vxe-column field="itemName" title="项目名称" align="left" min-width="180" show-overflow />
<vxe-column field="itemName" title="项目名称" align="left" min-width="180" show-overflow="title" />
<vxe-column field="itemType_dictText" title="类型" align="center" width="100" />
<vxe-column field="specification" title="规格" align="center" width="120" show-overflow />
<vxe-column field="specification" title="规格" align="center" width="120" show-overflow="title" />
<vxe-column field="dosage" title="剂量" align="center" width="80" />
<vxe-column field="unit" title="单位" align="center" width="70" />
<vxe-column field="quantity" title="数量" align="center" width="80" />
<vxe-column field="usageMethod" title="用法" align="center" width="100" show-overflow />
<vxe-column field="usageMethod" title="用法" align="center" width="100" show-overflow="title" />
</vxe-table>
</div>
</div>

View File

@@ -68,15 +68,15 @@
border
height="100%"
>
<vxe-column field="formNo" title="申请单号" align="center" width="180" show-overflow />
<vxe-column field="formNo" title="申请单号" align="center" width="180" show-overflow="title" />
<vxe-column field="patientName" title="患者姓名" align="center" width="110" />
<vxe-column field="genderEnum_enumText" title="性别" align="center" width="70" />
<vxe-column field="age" title="年龄" align="center" width="60" />
<vxe-column field="encounterNo" title="门诊号" align="center" width="140" show-overflow />
<vxe-column field="encounterNo" title="门诊号" align="center" width="140" show-overflow="title" />
<vxe-column field="formType_dictText" title="申请类型" align="center" width="110" />
<vxe-column field="itemNames" title="申请项目" align="left" min-width="200" show-overflow />
<vxe-column field="itemNames" title="申请项目" align="left" min-width="200" show-overflow="title" />
<vxe-column field="applyDoctorName" title="申请医生" align="center" width="110" />
<vxe-column field="deptName" title="申请科室" align="center" width="140" show-overflow />
<vxe-column field="deptName" title="申请科室" align="center" width="140" show-overflow="title" />
<vxe-column field="status_dictText" title="状态" align="center" width="90" />
<vxe-column title="申请时间" align="center" width="160">
<template #default="scope">
@@ -145,11 +145,11 @@
<div class="item-title">申请项目明细</div>
<vxe-table :data="detailData.items" border size="small">
<vxe-column type="index" title="序号" align="center" width="60" />
<vxe-column field="itemName" title="项目名称" align="left" show-overflow />
<vxe-column field="itemName" title="项目名称" align="left" show-overflow="title" />
<vxe-column field="itemCode" title="项目编码" align="center" width="140" />
<vxe-column field="specification" title="规格" align="center" width="120" />
<vxe-column field="quantity" title="数量" align="center" width="80" />
<vxe-column field="purpose" title="目的/说明" align="left" show-overflow />
<vxe-column field="purpose" title="目的/说明" align="left" show-overflow="title" />
</vxe-table>
</div>
</div>

View File

@@ -66,19 +66,19 @@
align="center"
title="姓名"
width="130"
show-overflow
show-overflow="title"
/>
<vxe-column
field="genderEnum_enumText"
align="center"
title="性别"
show-overflow
show-overflow="title"
/>
<vxe-column
align="center"
width="140"
title="就诊日期"
show-overflow
show-overflow="title"
>
<template #default="scope">
{{
@@ -138,7 +138,7 @@
<vxe-column
field="itemName"
title="药品名称"
show-overflow
show-overflow="title"
align="center"
/>
<vxe-column

View File

@@ -41,7 +41,7 @@
<!-- 数据表格 -->
<vxe-table v-loading="loading" :data="orderList" @checkbox-change="handleSelectionChange" border stripe>
<vxe-column type="checkbox" width="55" align="center" />
<vxe-column title="申请单号" field="applyNo" width="180" :show-overflow="true" />
<vxe-column title="申请单号" field="applyNo" width="180" show-overflow="title" />
<vxe-column title="申请类型" field="applyTypeName" width="80" align="center">
<template #default="{ row }">
<el-tag :type="row.applyType === 'exam' ? 'primary' : 'success'" size="small">
@@ -49,13 +49,13 @@
</el-tag>
</template>
</vxe-column>
<vxe-column title="患者ID" field="patientId" width="120" :show-overflow="true" />
<vxe-column title="患者姓名" field="patientName" width="100" :show-overflow="true" />
<vxe-column title="就诊号" field="visitNo" width="140" :show-overflow="true" />
<vxe-column title="开单科室" field="applyDeptCode" width="120" :show-overflow="true" />
<vxe-column title="申请医生" field="applyDocName" width="100" :show-overflow="true" />
<vxe-column title="患者ID" field="patientId" width="120" show-overflow="title" />
<vxe-column title="患者姓名" field="patientName" width="100" show-overflow="title" />
<vxe-column title="就诊号" field="visitNo" width="140" show-overflow="title" />
<vxe-column title="开单科室" field="applyDeptCode" width="120" show-overflow="title" />
<vxe-column title="申请医生" field="applyDocName" width="100" show-overflow="title" />
<vxe-column title="申请时间" field="applyTime" width="170" align="center" />
<vxe-column title="诊断/描述" field="clinicDesc" min-width="180" :show-overflow="true" />
<vxe-column title="诊断/描述" field="clinicDesc" min-width="180" show-overflow="title" />
<vxe-column title="加急" width="70" align="center">
<template #default="{ row }">
<el-tag v-if="row.isUrgent === 1" type="danger" size="small">加急</el-tag>

View File

@@ -46,7 +46,7 @@
<!-- 数据表格 -->
<vxe-table v-loading="loading" :data="orderList" @checkbox-change="handleSelectionChange" border stripe>
<vxe-column type="checkbox" width="55" align="center" />
<vxe-column title="申请单号" field="applyNo" width="180" :show-overflow="true" />
<vxe-column title="申请单号" field="applyNo" width="180" show-overflow="title" />
<vxe-column title="申请类型" field="applyTypeName" width="80" align="center">
<template #default="{ row }">
<el-tag :type="row.applyType === 'exam' ? 'primary' : 'success'" size="small">
@@ -54,19 +54,19 @@
</el-tag>
</template>
</vxe-column>
<vxe-column title="患者ID" field="patientId" width="120" :show-overflow="true" />
<vxe-column title="患者姓名" field="patientName" width="100" :show-overflow="true" />
<vxe-column title="就诊号" field="visitNo" width="140" :show-overflow="true" />
<vxe-column title="开单科室" field="applyDeptCode" width="120" :show-overflow="true" />
<vxe-column title="申请医生" field="applyDocName" width="100" :show-overflow="true" />
<vxe-column title="患者ID" field="patientId" width="120" show-overflow="title" />
<vxe-column title="患者姓名" field="patientName" width="100" show-overflow="title" />
<vxe-column title="就诊号" field="visitNo" width="140" show-overflow="title" />
<vxe-column title="开单科室" field="applyDeptCode" width="120" show-overflow="title" />
<vxe-column title="申请医生" field="applyDocName" width="100" show-overflow="title" />
<vxe-column title="申请时间" field="applyTime" width="170" align="center" />
<vxe-column title="诊断/描述" field="clinicDesc" min-width="180" :show-overflow="true" />
<vxe-column title="诊断/描述" field="clinicDesc" min-width="180" show-overflow="title" />
<vxe-column title="申请状态" width="100" align="center">
<template #default="{ row }">
<el-tag type="warning" size="small">待审批</el-tag>
</template>
</vxe-column>
<vxe-column title="备注" field="applyRemark" width="150" :show-overflow="true" />
<vxe-column title="备注" field="applyRemark" width="150" show-overflow="title" />
<vxe-column title="操作" width="160" align="center" fixed="right">
<template #default="{ row }">
<el-button type="success" link size="small" @click="handleApproveSingle(row)">

View File

@@ -35,10 +35,10 @@
height="calc(100vh - 320px)"
@cell-click="handlePatientClick"
>
<vxe-column field="patientName" title="姓名" align="center" width="120" show-overflow />
<vxe-column field="patientName" title="姓名" align="center" width="120" show-overflow="title" />
<vxe-column field="genderEnum_enumText" title="性别" align="center" width="70" />
<vxe-column field="age" title="年龄" align="center" width="60" />
<vxe-column field="encounterNo" title="门诊号" align="center" width="150" show-overflow />
<vxe-column field="encounterNo" title="门诊号" align="center" width="150" show-overflow="title" />
<vxe-column title="就诊日期" align="center" width="120">
<template #default="scope">
{{ scope.row.receptionTime ? formatDateStr(scope.row.receptionTime, 'YYYY-MM-DD') : '-' }}
@@ -82,9 +82,9 @@
@select="handleSelectionChange"
>
<vxe-column type="checkbox" width="55" align="center" />
<vxe-column field="itemName" title="项目名称" align="center" show-overflow />
<vxe-column field="itemName" title="项目名称" align="center" show-overflow="title" />
<vxe-column field="itemType" title="类型" align="center" width="100" />
<vxe-column field="specification" title="规格" align="center" width="120" show-overflow />
<vxe-column field="specification" title="规格" align="center" width="120" show-overflow="title" />
<vxe-column field="quantity" title="数量" align="center" width="80" />
<vxe-column field="unitPrice" title="单价" align="right" width="100">
<template #default="scope">
@@ -97,7 +97,7 @@
</template>
</vxe-column>
<vxe-column field="doctorName" title="开单医生" align="center" width="120" />
<vxe-column field="deptName" title="科室" align="center" width="140" show-overflow />
<vxe-column field="deptName" title="科室" align="center" width="140" show-overflow="title" />
<vxe-column title="开单时间" align="center" width="150">
<template #default="scope">
{{ scope.row.createTime ? formatDateStr(scope.row.createTime, 'YYYY-MM-DD HH:mm') : '-' }}

View File

@@ -167,7 +167,7 @@
title="ID"
min-width="150"
align="center"
show-overflow
show-overflow="title"
/>
<vxe-column
title="急"
@@ -204,7 +204,7 @@
field="invitedObject"
title="邀请对象"
min-width="150"
show-overflow
show-overflow="title"
/>
<vxe-column
field="consultationRequestDate"

View File

@@ -85,7 +85,7 @@
<vxe-table
v-loading="loading"
:data="definitionList"
show-overflow
show-overflow="title"
>
<vxe-column
type="checkbox"
@@ -283,7 +283,7 @@
<vxe-table
v-loading="loading"
:data="definitionList"
show-overflow
show-overflow="title"
>
<vxe-column
type="checkbox"
@@ -481,7 +481,7 @@
<vxe-table
v-loading="loading"
:data="definitionList"
show-overflow
show-overflow="title"
>
<vxe-column
type="checkbox"
@@ -617,7 +617,7 @@
<vxe-table
v-loading="detailLoading"
:data="definitionDetailList"
show-overflow
show-overflow="title"
>
<vxe-column
title="条件"

View File

@@ -18,7 +18,7 @@
align="center"
field="adviceName"
width="200"
show-overflow
show-overflow="title"
/>
<vxe-column
title="包装单位"
@@ -54,14 +54,14 @@
align="center"
field="volume"
width="120"
show-overflow
show-overflow="title"
/>
<vxe-column
title="用法"
align="center"
field="methodCode_dictText"
width="120"
show-overflow
show-overflow="title"
/>
<!-- 修改价格列从inventoryList中获取价格 -->
<vxe-column
@@ -89,7 +89,7 @@
align="center"
field="rateCode_dictText"
width="100"
show-overflow
show-overflow="title"
/>
<vxe-column
title="注射药品"
@@ -117,13 +117,13 @@
align="center"
field="ybNo"
width="100"
show-overflow
show-overflow="title"
/>
<!-- <vxe-column title="限制使用标志" align="center" field="useLimitFlag" /> -->
<vxe-column
title="限制使用范围"
align="center"
:show-overflow="true"
show-overflow="title"
field="useScope"
width="120"
>

View File

@@ -76,7 +76,7 @@
field="invitedObjectText"
title="邀请对象"
min-width="120"
show-overflow
show-overflow="title"
/>
<vxe-column
field="department"

View File

@@ -29,7 +29,7 @@
align="left"
field="name"
min-width="200"
show-overflow
show-overflow="title"
/>
<vxe-column
title="ICD代码"

View File

@@ -21,14 +21,14 @@
title="主诉"
align="left"
field="name"
:show-overflow="true"
show-overflow="title"
/>
<vxe-column
title="时间"
align="center"
field="createTime"
width="180"
:show-overflow="true"
show-overflow="title"
/>
<vxe-column
title="操作"

View File

@@ -64,7 +64,7 @@
align="left"
field="name"
min-width="180"
show-overflow
show-overflow="title"
>
<template #default="scope">
<el-tooltip
@@ -261,7 +261,7 @@
title="医嘱名称"
field="orderDefinitionName"
min-width="150"
show-overflow
show-overflow="title"
/>
<vxe-column
title="数量"
@@ -385,7 +385,7 @@
title="医嘱名称"
field="orderDefinitionName"
min-width="180"
show-overflow
show-overflow="title"
/>
<vxe-column
title="数量"
@@ -465,7 +465,7 @@
title="医嘱名称"
field="adviceName"
min-width="150"
show-overflow
show-overflow="title"
/>
<vxe-column
title="类型"
@@ -477,7 +477,7 @@
title="规格"
field="volume"
width="100"
show-overflow
show-overflow="title"
/>
<vxe-column
title="单价"

View File

@@ -96,7 +96,7 @@
align="center"
field="applyDeptName"
width="120"
show-overflow
show-overflow="title"
/>
<!-- 手术名称 -->
@@ -105,7 +105,7 @@
align="center"
field="surgeryName"
min-width="150"
show-overflow
show-overflow="title"
/>
<!-- 手术等级 -->

View File

@@ -66,19 +66,19 @@
align="center"
title="姓名"
width="130"
show-overflow
show-overflow="title"
/>
<vxe-column
field="genderEnum_enumText"
align="center"
title="性别"
show-overflow
show-overflow="title"
/>
<vxe-column
align="center"
width="140"
title="就诊日期"
show-overflow
show-overflow="title"
>
<template #default="scope">
{{
@@ -138,7 +138,7 @@
<vxe-column
field="itemName"
title="药品名称"
show-overflow
show-overflow="title"
align="center"
/>
<vxe-column

View File

@@ -33,7 +33,7 @@
</el-form>
<vxe-table :data="tableData" border height="calc(100vh - 400px)" v-loading="loading">
<vxe-column type="seq" title="序号" width="60" />
<vxe-column field="messageId" title="消息ID" width="160" show-overflow />
<vxe-column field="messageId" title="消息ID" width="160" show-overflow="title" />
<vxe-column field="messageType" title="类型" width="100" />
<vxe-column field="sourceSystem" title="来源" width="100" />
<vxe-column field="targetSystem" title="目标" width="100" />

View File

@@ -23,9 +23,9 @@
</el-form>
<vxe-table :data="tableData" border height="calc(100vh - 320px)" v-loading="loading">
<vxe-column type="seq" title="序号" width="60" />
<vxe-column field="serviceName" title="服务名称" width="160" show-overflow />
<vxe-column field="serviceName" title="服务名称" width="160" show-overflow="title" />
<vxe-column field="serviceVersion" title="版本" width="80" />
<vxe-column field="serviceEndpoint" title="端点" min-width="250" show-overflow />
<vxe-column field="serviceEndpoint" title="端点" min-width="250" show-overflow="title" />
<vxe-column field="protocol" title="协议" width="80" />
<vxe-column field="serviceStatus" title="状态" width="80" align="center">
<template #default="{ row }">

View File

@@ -113,17 +113,17 @@
<vxe-column
title="申请编号"
field="applicationNo"
:show-overflow="true"
show-overflow="title"
/>
<vxe-column
title="项目名称"
field="name"
:show-overflow="true"
show-overflow="title"
/>
<vxe-column
title="项目编号"
field="busNo"
:show-overflow="true"
show-overflow="title"
/>
<vxe-column title="医保编码">
<template #default="scope">
@@ -136,7 +136,7 @@
<vxe-column
title="项目分类"
field="itemTypeName"
:show-overflow="true"
show-overflow="title"
align="center"
width="100"
/>
@@ -173,14 +173,14 @@
<vxe-column
title="开始时间"
field="startDate"
:show-overflow="true"
show-overflow="title"
align="center"
width="150"
/>
<vxe-column
title="结束时间"
field="endDate"
:show-overflow="true"
show-overflow="title"
align="center"
width="150"
/>
@@ -547,32 +547,32 @@
<vxe-column
title="项目编号"
field="busNo"
:show-overflow="true"
show-overflow="title"
/>
<vxe-column
title="项目名称"
field="name"
:show-overflow="true"
show-overflow="title"
/>
<vxe-column
title="医保编码"
field="ybNo"
:show-overflow="true"
show-overflow="title"
/>
<vxe-column
title="医保等级"
field="chrgitmLvName"
:show-overflow="true"
show-overflow="title"
/>
<vxe-column
title="生产厂家"
field="manufacturerText"
:show-overflow="true"
show-overflow="title"
/>
<vxe-column
title="规格"
field="totalVolume"
:show-overflow="true"
show-overflow="title"
/>
</vxe-table>
<pagination

View File

@@ -34,19 +34,19 @@
<vxe-column
title="医保分项编码"
field="ybClass"
:show-overflow="true"
show-overflow="title"
align="center"
/>
<vxe-column
title="医保分项名称"
field="ybClassName"
:show-overflow="true"
show-overflow="title"
align="center"
/>
<vxe-column
title="医保等级"
field="ybLvName"
:show-overflow="true"
show-overflow="title"
align="center"
/>
<!-- 自付比例列 -->
@@ -134,12 +134,12 @@
<vxe-column
title="项目编号"
field="busNo"
:show-overflow="true"
show-overflow="title"
/>
<vxe-column
title="项目名称"
field="name"
:show-overflow="true"
show-overflow="title"
/>
<vxe-column
title="医保编码"
@@ -155,14 +155,14 @@
<vxe-column
title="项目分类"
field="itemTypeName"
:show-overflow="true"
show-overflow="title"
width="110"
align="center"
/>
<vxe-column
title="医保等级"
field="chrgitmLvName"
:show-overflow="true"
show-overflow="title"
width="110"
align="center"
/>
@@ -199,13 +199,13 @@
<vxe-column
title="开始时间"
field="startDate"
:show-overflow="true"
show-overflow="title"
align="center"
/>
<vxe-column
title="结束时间"
field="endDate"
:show-overflow="true"
show-overflow="title"
align="center"
/>
</vxe-table>

View File

@@ -109,98 +109,98 @@
<vxe-column
title="学号"
field="studentId"
:show-overflow="true"
show-overflow="title"
width="150"
/>
<vxe-column
title="姓名"
field="name"
:show-overflow="true"
show-overflow="title"
width="150"
/>
<vxe-column
title="性别"
field="gender_dictText"
:show-overflow="true"
show-overflow="title"
width="70"
align="center"
/>
<vxe-column
title="年龄"
field="age"
:show-overflow="true"
show-overflow="title"
width="70"
align="center"
/>
<vxe-column
title="身份证号"
field="idNumber"
:show-overflow="true"
show-overflow="title"
width="200"
/>
<vxe-column
title="电话"
field="phone"
:show-overflow="true"
show-overflow="title"
width="150"
/>
<vxe-column
title="学院"
field="college"
:show-overflow="true"
show-overflow="title"
width="150"
/>
<vxe-column
title="专业"
field="major"
:show-overflow="true"
show-overflow="title"
width="150"
/>
<vxe-column
title="年级"
field="grade"
:show-overflow="true"
show-overflow="title"
width="100"
/>
<vxe-column
title="学历层次"
field="educationLevel_dictText"
:show-overflow="true"
show-overflow="title"
width="120"
align="center"
/>
<vxe-column
title="入校时间"
field="enrollmentDate"
:show-overflow="true"
show-overflow="title"
width="120"
align="center"
/>
<vxe-column
title="离校时间"
field="graduationDate"
:show-overflow="true"
show-overflow="title"
width="120"
align="center"
/>
<vxe-column
title="学习形式"
field="studyMode_dictText"
:show-overflow="true"
show-overflow="title"
width="120"
align="center"
/>
<vxe-column
title="在校状态"
field="studentStatus_dictText"
:show-overflow="true"
show-overflow="title"
width="100"
align="center"
/>
<vxe-column
title="体检结果"
field="physicalExamResult_dictText"
:show-overflow="true"
show-overflow="title"
width="120"
align="center"
/>

View File

@@ -2,7 +2,7 @@
<div class="patient-list">
<vxe-table
:row-config="{ isCurrent: true }" :data="data"
show-overflow
show-overflow="title"
height="100%"
@current-change="handleCurrentChange"
>

View File

@@ -54,8 +54,7 @@
<vxe-table
ref="tableRef"
:data="treatHospitalizedData"
style="width: 100%"
height="100%"
min-width="1600px"
show-overflow="title"
@radio-change="handleRadioChange"
>
@@ -68,6 +67,7 @@
/>
<vxe-column
field="patientName"
min-width="120"
align="center"
title="申请患者"
/>
@@ -85,6 +85,7 @@
/>
<vxe-column
field="busNo"
min-width="140"
align="center"
title="患者住院号"
>
@@ -94,6 +95,7 @@
</vxe-column>
<vxe-column
field="contractNo"
min-width="140"
align="center"
title="费用性质"
>
@@ -105,7 +107,7 @@
field="idCard"
align="center"
title="身份证号码"
width="180"
width="200"
>
<template #default="scope">
{{ scope.row.idCard || '-' }}
@@ -113,9 +115,9 @@
</vxe-column>
<vxe-column
field="organizationName"
min-width="140"
align="center"
title="入院科室"
width="120"
>
<template #default="scope">
{{ scope.row.organizationName || '-' }}
@@ -125,10 +127,11 @@
field="requestTime"
align="center"
title="登记时间"
width="160"
width="170"
/>
<vxe-column
field="admitSourceCode"
min-width="100"
align="center"
title="入院类型"
>
@@ -149,6 +152,7 @@
</vxe-column>
<vxe-column
field="sourceName"
min-width="120"
align="center"
title="申请来源"
>
@@ -159,11 +163,13 @@
<vxe-column
field="wardName"
min-width="120"
align="center"
title="入院病区"
/>
<vxe-column
field="registrar"
min-width="100"
align="center"
title="登记员"
/>
@@ -269,6 +275,10 @@ const queryParams = ref({
pageSize: 10,
registeredFlag: '1',
searchKey: '',
idCard: '',
organizationId: '',
startTime: '',
endTime: '',
});
const treatHospitalizedData = ref([]);
@@ -326,8 +336,8 @@ const doVoid = (row) => {
.catch(() => {});
};
const handleRadioChange = ({ newValue }) => {
selectedRow.value = newValue;
const handleRadioChange = ({ row }) => {
selectedRow.value = row;
};
const handlePrintCertificate = async () => {
@@ -508,6 +518,7 @@ const getList = () => {
}
.table-container {
padding: 8px 16px;
overflow-x: auto;
}
}
</style>

View File

@@ -34,7 +34,7 @@
:data="treatHospitalizedData"
style="width: 100%"
height="100%"
show-overflow
show-overflow="title"
>
<vxe-column
type="seq"

Some files were not shown because too many files have changed in this diff Show More