Files
his/MD/design/PHASE4_LOCAL_DESIGN.md
chenqi 575f5d6c32 fix(database): 修复数据库字典重复和表结构缺失问题
- 删除手术状态下拉框的重复字典数据,保留每组中dict_code最小的记录
- 修复HisBaseEntity列缺失问题,为多个表添加create_by、update_by、update_time等基础字段
- 为adm_patient表添加邮政编码、户籍地址、监护人信息、患者来源等缺失字段
- 添加文化程度字典类型和相关字典数据,补充3919到3914等10个学历级别选项
- 为adm_patient_identifier表创建tenant_id和patient_id的联合索引以提升查询性能
- 修复prescription_intercept_log和clinical_pathway_execution表的基础实体字段缺失
- 为wor_device_request表增加医嘱退回相关的back_reason、performer_check_id等字段
- 创建EMPI核心表empi_person和empi_person_id_mapping用于全局患者主索引管理
- 为empi_merge_log表添加create_time字段以完善审计信息
- 更新院感管理和评审保障模块的设计文档,明确各模块实现状态和缺失功能
2026-06-17 11:46:56 +08:00

43 KiB
Raw Blame History

Phase 4 广西地方特色模块详细设计

属性
文档类型 详细设计
版本 v1.0
日期 2026-06-17
模块 TCM / Epidemic / EHCard / Invoice / DRG深化

一、中医壮医模块tcm

1.1 已有代码分析

后端3个文件

  • TcmController.java — 23行5个端点方剂CRUD + 体质辨识 + 统计
  • ITcmAppService.java — 11行5个方法
  • TcmAppServiceImpl.java — 业务逻辑实现

域实体2个

  • TcmPrescription — tcm_prescription表字段prescriptionName/type/herbs/dosage/usage/indication/source/enabled
  • TcmConstitutionAssessment — tcm_constitution_assessment表字段encounterId/patientId/constitutionType/score/recommendation/assessorId/assessmentTime

前端2个页面

  • tcm/traditional/index.vue — 方剂列表+详情+新增弹窗有完整script
  • tcm/constitution/index.vue — 体质辨识页无script仅有模板

Flyway V39 — 已创建 tcm_prescription + tcm_constitution_assessment

1.2 缺失功能清单

编号 功能 优先级
TCM-01 壮医三诊(望诊/脉诊/目诊)录入与存储 P0
TCM-02 九种体质辨识问卷(平和/气虚/阳虚/阴虚/痰湿/湿热/血瘀/气郁/特禀) P0
TCM-03 壮医诊疗记录关联encounterId P0
TCM-04 民族药编码表(壮药/瑶药/苗药) P1
TCM-05 常用方剂模板(可引用到处方) P1
TCM-06 中医处方完整流程(开方→审核→取药→执行) P1
TCM-07 体质辨识统计报表 P2

1.3 业务流程

壮医三诊流程

医生选择患者 → 进入壮医诊疗页面
  ├→ 望诊:面色/舌象/形态选择 → 保存
  ├→ 脉诊:脉象类型选择(浮/沉/迟/数等) → 保存
  ├→ 目诊:眼部特征选择 → 保存
  └→ 综合诊断 → 开具壮医处方 → 关联到医嘱

九种体质辨识流程

选择患者 → 启动体质辨识
  ├→ 展示9套问卷每套8-10题5级评分
  ├→ 医生逐题评分或患者自评
  ├→ 计算各体质得分
  ├→ 判定体质类型(主要/次要)
  └→ 生成调养建议 → 保存到tcm_constitution_assessment

1.4 数据库设计

-- V47__tcm_zhuang_diagnosis.sql

-- 壮医三诊记录
CREATE TABLE IF NOT EXISTS tcm_zhuang_diagnosis (
    id BIGSERIAL PRIMARY KEY,
    encounter_id BIGINT NOT NULL,
    patient_id BIGINT NOT NULL,
    patient_name VARCHAR(50),
    diagnosis_date DATE NOT NULL,
    visit_type VARCHAR(20) NOT NULL,
    face_color VARCHAR(50),
    face_shape VARCHAR(50),
    tongue_color VARCHAR(50),
    tongue_coating VARCHAR(50),
    tongue_shape VARCHAR(50),
    pulse_type VARCHAR(50),
    pulse_detail TEXT,
    eye_color VARCHAR(50),
    eye_vessel VARCHAR(50),
    eye_spot VARCHAR(50),
    body_shape VARCHAR(50),
    skin_condition VARCHAR(50),
    diagnosis_result TEXT,
    zhuang_diagnosis VARCHAR(200),
    doctor_id BIGINT,
    doctor_name VARCHAR(64),
    tenant_id INTEGER DEFAULT 0,
    delete_flag CHAR(1) DEFAULT '0',
    create_by VARCHAR(64),
    create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    update_by VARCHAR(64),
    update_time TIMESTAMP
);
COMMENT ON TABLE tcm_zhuang_diagnosis IS '壮医三诊记录';
COMMENT ON COLUMN tcm_zhuang_diagnosis.visit_type IS '诊法(WANG望/MAI脉/MU目)';
CREATE INDEX IF NOT EXISTS idx_tzd_encounter ON tcm_zhuang_diagnosis(encounter_id);

-- 体质辨识问卷模板
CREATE TABLE IF NOT EXISTS tcm_constitution_questionnaire (
    id BIGSERIAL PRIMARY KEY,
    constitution_type VARCHAR(20) NOT NULL,
    question_no INT NOT NULL,
    question_text TEXT NOT NULL,
    option_a VARCHAR(200),
    option_b VARCHAR(200),
    option_c VARCHAR(200),
    option_d VARCHAR(200),
    option_e VARCHAR(200),
    score_a INT DEFAULT 1,
    score_b INT DEFAULT 2,
    score_c INT DEFAULT 3,
    score_d INT DEFAULT 4,
    score_e INT DEFAULT 5,
    enabled CHAR(1) DEFAULT '1',
    tenant_id INTEGER DEFAULT 0,
    delete_flag CHAR(1) DEFAULT '0',
    create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
COMMENT ON TABLE tcm_constitution_questionnaire IS '体质辨识问卷模板';
CREATE INDEX IF NOT EXISTS idx_tccq_type ON tcm_constitution_questionnaire(constitution_type);

-- 体质辨识答题记录
CREATE TABLE IF NOT EXISTS tcm_constitution_answer (
    id BIGSERIAL PRIMARY KEY,
    assessment_id BIGINT NOT NULL,
    question_id BIGINT NOT NULL,
    answer_option CHAR(1),
    score INT,
    tenant_id INTEGER DEFAULT 0,
    create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
COMMENT ON TABLE tcm_constitution_answer IS '体质辨识答题记录';
CREATE INDEX IF NOT EXISTS idx_tca_assessment ON tcm_constitution_answer(assessment_id);

-- 民族药编码表
CREATE TABLE IF NOT EXISTS tcm_ethnic_drug (
    id BIGSERIAL PRIMARY KEY,
    drug_code VARCHAR(50) NOT NULL,
    drug_name VARCHAR(200) NOT NULL,
    drug_type VARCHAR(20) NOT NULL,
    pinyin_code VARCHAR(50),
    wubi_code VARCHAR(50),
    category VARCHAR(50),
    nature VARCHAR(50),
    flavor VARCHAR(50),
    channel_tropism VARCHAR(100),
    indication TEXT,
    dosage VARCHAR(100),
    contraindication TEXT,
    source VARCHAR(200),
    enabled CHAR(1) DEFAULT '1',
    tenant_id INTEGER DEFAULT 0,
    delete_flag CHAR(1) DEFAULT '0',
    create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    update_time TIMESTAMP
);
COMMENT ON TABLE tcm_ethnic_drug IS '民族药编码表';
COMMENT ON COLUMN tcm_ethnic_drug.drug_type IS '类型(ZHUANG壮药/YAO瑶药/MIAO苗药)';
CREATE INDEX IF NOT EXISTS ted_code ON tcm_ethnic_drug(drug_code);
CREATE INDEX IF NOT EXISTS ted_type ON tcm_ethnic_drug(drug_type);

-- 中医处方明细扩展tcm_prescription
CREATE TABLE IF NOT EXISTS tcm_prescription_item (
    id BIGSERIAL PRIMARY KEY,
    prescription_id BIGINT NOT NULL,
    drug_code VARCHAR(50),
    drug_name VARCHAR(200) NOT NULL,
    drug_type VARCHAR(20) DEFAULT 'TCM',
    dosage VARCHAR(100),
    unit VARCHAR(20),
    frequency VARCHAR(50),
    usage_method VARCHAR(100),
    decoction_method VARCHAR(100),
    sort_order INT DEFAULT 0,
    tenant_id INTEGER DEFAULT 0,
    delete_flag CHAR(1) DEFAULT '0',
    create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
COMMENT ON TABLE tcm_prescription_item IS '中医处方明细';
COMMENT ON COLUMN tcm_prescription_item.drug_type IS '类型(TCM中药/ZHUANG壮药/YAO瑶药)';
CREATE INDEX IF NOT EXISTS tpi_prescription ON tcm_prescription_item(prescription_id);

1.5 API接口设计

路径前缀: /healthlink-his/api/v1/tcm

方法 路径 说明 请求体
POST /zhuang/diagnosis 保存壮医三诊 TcmZhuangDiagnosisDto
GET /zhuang/diagnosis/encounter/{id} 查询诊疗记录
GET /zhuang/diagnosis/list 诊疗记录列表 params: startDate, endDate, patientId
GET /constitution/questionnaire/{type} 获取体质问卷
POST /constitution/assess 提交体质辨识(含答题) ConstitutionAssessDto
GET /constitution/record/{id} 查询辨识记录详情
GET /ethnic-drug/list 民族药列表 params: drugType, keyword
POST /ethnic-drug 新增民族药 TcmEthnicDrugDto
GET /prescription/template/list 方剂模板列表 params: type
POST /prescription/item 保存处方明细 TcmPrescriptionItemDto
GET /statistics/daily 每日诊疗统计 params: startDate, endDate

1.6 前端设计

页面 路径 组件
壮医三诊 tcm/zhuangDiagnosis/index.vue 左侧患者列表 + 右侧三诊tab望/脉/目)
体质辨识 tcm/constitution/index.vue 升级现有页面,添加问卷交互
民族药管理 tcm/ethnicDrug/index.vue 表格 + 新增/编辑弹窗
处方模板 tcm/prescriptionTemplate/index.vue 模板列表 + 引用到处方
中医处方 tcm/prescription/index.vue 处方开具页,可选模板

壮医三诊页面布局

┌──────────────────────────────────────────────────┐
│  患者信息栏:姓名 | 性别 | 年龄 | 就诊号          │
├──────────────┬───────────────────────────────────┤
│  患者列表     │  Tab: [望诊] [脉诊] [目诊] [综合]  │
│  ──────────  │  ┌─────────────────────────────┐  │
│  患者A  ✓    │  │  面色:[萎黄] [苍白] [红润]   │  │
│  患者B       │  │  舌色:[淡白] [淡红] [红]     │  │
│  患者C       │  │  舌苔:[薄白] [黄腻] [无苔]   │  │
│             │  │  脉象:[浮] [沉] [迟] [数]    │  │
│             │  │  目色:[正常] [发黄] [充血]    │  │
│             │  └─────────────────────────────┘  │
│             │  诊断结果:[________________]       │
│             │  [保存] [开具处方]                  │
└──────────────┴───────────────────────────────────┘

二、传染病直报模块epidemic

2.1 已有代码分析

后端3个文件

  • EpidemicController.java — 20行4个端点上报/确认/列表/统计
  • IEpidemicAppService.java — 10行4个方法
  • EpidemicAppServiceImpl.java — 实现

域实体1个

  • EpidemicReport — epidemic_report表字段encounterId/patientId/patientName/diseaseName/diseaseCode/reportType/reporterId/reporterName/reportDate/status/cdcConfirmNo

前端1个页面 + 1个API

  • diseaseReportManagement/ReportManagement/index.vue — 2028行有完整script包含统计卡片+报卡列表
  • diseaseReportManagement/ReportManagement/api.js — API定义

2.2 缺失功能清单

编号 功能 优先级
EPI-01 传染病自动筛查规则引擎 P0
EPI-02 广西疾控直报对接(国家传染病网络直报系统) P0
EPI-03 报告管理流程(填报→审核→上报→确认) P0
EPI-04 传染病病种目录(广西重点) P1
EPI-05 统计分析(时间/病种/区域分布) P1
EPI-06 密接追踪管理 P2

2.3 业务流程

传染病报告全流程

门诊/住院/检验 发现疑似病例
  ├→ 自动筛查:诊断/检验结果匹配传染病规则
  ├→ 触发报卡:弹窗提醒医生填写报告
  ├→ 医生填报:患者信息+诊断+发病日期+报告类型
  ├→ 科室审核:科室主任审核确认
  ├→ 预防保健科审核:院内终审
  ├→ 上报疾控:对接广西疾控直报系统
  ├→ 疾控确认:返回确认编号
  └→ 归档更新epidemic_report状态

状态流转

DRAFT(草稿) → PENDING_REVIEW(待审核) → DEPT_APPROVED(科室通过)
  → ADMIN_APPROVED(防保科通过) → SUBMITTED(已上报) → CDC_CONFIRMED(疾控确认)

2.4 数据库设计

-- V47__epidemic_enhancement.sql

-- 传染病筛查规则
CREATE TABLE IF NOT EXISTS epidemic_screening_rule (
    id BIGSERIAL PRIMARY KEY,
    rule_name VARCHAR(200) NOT NULL,
    rule_type VARCHAR(30) NOT NULL,
    disease_code VARCHAR(20) NOT NULL,
    disease_name VARCHAR(200) NOT NULL,
    rule_condition TEXT NOT NULL,
    rule_source VARCHAR(50),
    priority INT DEFAULT 0,
    enabled CHAR(1) DEFAULT '1',
    tenant_id INTEGER DEFAULT 0,
    delete_flag CHAR(1) DEFAULT '0',
    create_by VARCHAR(64),
    create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    update_time TIMESTAMP
);
COMMENT ON TABLE epidemic_screening_rule IS '传染病筛查规则';
COMMENT ON COLUMN epidemic_screening_rule.rule_type IS '类型(DIAGNOSIS诊断/LAB检验/SYMPTOM症状)';
CREATE INDEX IF NOT EXISTS esr_disease ON epidemic_screening_rule(disease_code);

-- 筛查命中记录
CREATE TABLE IF NOT EXISTS epidemic_screening_hit (
    id BIGSERIAL PRIMARY KEY,
    rule_id BIGINT NOT NULL,
    encounter_id BIGINT NOT NULL,
    patient_id BIGINT NOT NULL,
    patient_name VARCHAR(50),
    hit_source VARCHAR(50),
    hit_detail TEXT,
    hit_time TIMESTAMP NOT NULL,
    report_id BIGINT,
    handle_status VARCHAR(20) DEFAULT 'PENDING',
    handler VARCHAR(64),
    handle_time TIMESTAMP,
    tenant_id INTEGER DEFAULT 0,
    delete_flag CHAR(1) DEFAULT '0',
    create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
COMMENT ON TABLE epidemic_screening_hit IS '筛查命中记录';
CREATE INDEX IF NOT EXISTS esh_encounter ON epidemic_screening_hit(encounter_id);

-- 广西疾控直报记录
CREATE TABLE IF NOT EXISTS epidemic_cdc_submission (
    id BIGSERIAL PRIMARY KEY,
    report_id BIGINT NOT NULL,
    cdc_system VARCHAR(50) DEFAULT 'GX_CDC',
    submission_type VARCHAR(30) NOT NULL,
    submission_time TIMESTAMP,
    submission_data TEXT,
    response_code VARCHAR(20),
    response_message TEXT,
    cdc_confirm_no VARCHAR(100),
    confirm_time TIMESTAMP,
    status VARCHAR(20) DEFAULT 'PENDING',
    retry_count INT DEFAULT 0,
    last_retry_time TIMESTAMP,
    tenant_id INTEGER DEFAULT 0,
    delete_flag CHAR(1) DEFAULT '0',
    create_by VARCHAR(64),
    create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
COMMENT ON TABLE epidemic_cdc_submission IS '广西疾控直报记录';
CREATE INDEX IF NOT EXISTS ecs_report ON epidemic_cdc_submission(report_id);

-- 传染病病种目录(广西重点)
CREATE TABLE IF NOT EXISTS epidemic_disease_catalog (
    id BIGSERIAL PRIMARY KEY,
    disease_code VARCHAR(20) NOT NULL,
    disease_name VARCHAR(200) NOT NULL,
    disease_class VARCHAR(20) NOT NULL,
    report_type VARCHAR(20) NOT NULL,
    report_deadline_hours INT,
    isolation_required CHAR(1) DEFAULT '0',
    enabled CHAR(1) DEFAULT '1',
    tenant_id INTEGER DEFAULT 0,
    delete_flag CHAR(1) DEFAULT '0',
    create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
COMMENT ON TABLE epidemic_disease_catalog IS '传染病病种目录';
COMMENT ON COLUMN epidemic_disease_catalog.disease_class IS '分类(A甲类/B乙类/C丙类)';
COMMENT ON COLUMN epidemic_disease_catalog.report_type IS '报告类型(TIMELY即时/AGGREGATE聚合)';
CREATE UNIQUE INDEX IF NOT EXISTS edc_code ON epidemic_disease_catalog(disease_code);

-- 扩展epidemic_report字段
ALTER TABLE epidemic_report ADD COLUMN IF NOT EXISTS onset_date DATE;
ALTER TABLE epidemic_report ADD COLUMN IF NOT EXISTS case_type VARCHAR(20);
ALTER TABLE epidemic_report ADD COLUMN IF NOT EXISTS isolation_location VARCHAR(100);
ALTER TABLE epidemic_report ADD COLUMN IF NOT EXISTS contact_count INT DEFAULT 0;
ALTER TABLE epidemic_report ADD COLUMN IF NOT EXISTS dept_approver VARCHAR(64);
ALTER TABLE epidemic_report ADD COLUMN IF NOT EXISTS dept_approve_time TIMESTAMP;
ALTER TABLE epidemic_report ADD COLUMN IF NOT EXISTS admin_approver VARCHAR(64);
ALTER TABLE epidemic_report ADD COLUMN IF NOT EXISTS admin_approve_time TIMESTAMP;
ALTER TABLE epidemic_report ADD COLUMN IF NOT EXISTS submit_time TIMESTAMP;
ALTER TABLE epidemic_report ADD COLUMN IF NOT EXISTS source_type VARCHAR(30);

2.5 API接口设计

路径前缀: /healthlink-his/api/v1/epidemic

方法 路径 说明 请求体
POST /report 新增/修改报告 EpidemicReportDto
PUT /report/{id}/status 更新报告状态 params: status, remark
GET /report/{id} 报告详情
GET /report/list 报告列表 params: status, diseaseCode, startDate, endDate
POST /report/{id}/submit 提交上报
POST /report/{id}/approve 审核 params: approveType, result, remark
GET /screening/rules 筛查规则列表
POST /screening/rule 新增/修改规则 ScreeningRuleDto
POST /screening/trigger 手动触发筛查 params: encounterId
GET /screening/hits 筛查命中记录 params: startDate, endDate
GET /cdc/submission/{reportId} 直报记录
POST /cdc/resubmit/{id} 重新上报
GET /disease/catalog 病种目录 params: diseaseClass
GET /statistics/summary 统计汇总 params: startDate, endDate
GET /statistics/trend 趋势分析 params: months

2.6 前端设计

页面 路径 组件
报告管理(升级) diseaseReportManagement/ReportManagement/index.vue 升级现有页面
报告详情 diseaseReportManagement/ReportDetail/index.vue 详情+审核流
筛查规则 diseaseReportManagement/ScreeningRule/index.vue 规则配置
统计分析 diseaseReportManagement/Statistics/index.vue 图表+数据表
病种目录 diseaseReportManagement/DiseaseCatalog/index.vue 目录管理

三、电子健康卡模块ehcard— 新建

3.1 已有代码分析

完全缺失,无后端模块、无前端页面、无数据库表。

3.2 缺失功能清单

编号 功能 优先级
EH-01 健康卡申领(对接广西健康云平台) P0
EH-02 就诊使用(挂号/就诊/取药验证) P0
EH-03 卡管理(挂失/补办/注销) P0
EH-04 健康卡绑定患者信息 P0
EH-05 健康卡二维码展示 P1
EH-06 健康卡消费记录 P2

3.3 业务流程

健康卡申领流程

患者通过自助机/手机/窗口
  ├→ 输入身份证号 + 手机号
  ├→ 调用广西健康云平台验证身份
  ├→ 获取/创建健康卡号
  ├→ 绑定患者基本信息
  ├→ 生成电子健康卡(二维码)
  └→ 激活使用

就诊使用流程

患者出示健康卡二维码
  ├→ 扫码验证有效性
  ├→ 关联到挂号单
  ├→ 就诊时自动调取健康档案
  ├→ 取药时核验身份
  └→ 记录使用日志

3.4 数据库设计

-- V47__ehcard.sql

-- 电子健康卡
CREATE TABLE IF NOT EXISTS ehcard (
    id BIGSERIAL PRIMARY KEY,
    card_no VARCHAR(50) NOT NULL,
    card_type VARCHAR(20) DEFAULT 'ELECTRONIC',
    patient_id BIGINT NOT NULL,
    patient_name VARCHAR(50),
    id_card VARCHAR(30),
    phone VARCHAR(20),
    card_status VARCHAR(20) DEFAULT 'ACTIVE',
    platform_card_id VARCHAR(100),
    qr_code TEXT,
    bind_time TIMESTAMP,
    active_time TIMESTAMP,
    expire_time TIMESTAMP,
    loss_time TIMESTAMP,
    loss_reason TEXT,
    cancel_time TIMESTAMP,
    cancel_reason TEXT,
    tenant_id INTEGER DEFAULT 0,
    delete_flag CHAR(1) DEFAULT '0',
    create_by VARCHAR(64),
    create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    update_by VARCHAR(64),
    update_time TIMESTAMP
);
COMMENT ON TABLE ehcard IS '电子健康卡';
COMMENT ON COLUMN ehcard.card_status IS '状态(ACTIVE有效/LOST挂失/CANCELLED注销/EXPIRED过期)';
CREATE INDEX IF NOT EXISTS ec_patient ON ehcard(patient_id);
CREATE INDEX IF NOT EXISTS ec_card_no ON ehcard(card_no);
CREATE UNIQUE INDEX IF NOT EXISTS ec_platform_id ON ehcard(platform_card_id);

-- 健康卡使用记录
CREATE TABLE IF NOT EXISTS ehcard_usage_log (
    id BIGSERIAL PRIMARY KEY,
    card_id BIGINT NOT NULL,
    card_no VARCHAR(50),
    patient_id BIGINT,
    usage_type VARCHAR(30) NOT NULL,
    usage_time TIMESTAMP NOT NULL,
    encounter_id BIGINT,
    encounter_no VARCHAR(50),
    usage_dept VARCHAR(100),
    usage_doctor VARCHAR(64),
    usage_detail TEXT,
    verification_result VARCHAR(20),
    tenant_id INTEGER DEFAULT 0,
    create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
COMMENT ON TABLE ehcard_usage_log IS '健康卡使用记录';
COMMENT ON COLUMN ehcard_usage_log.usage_type IS '类型(REGISTER挂号/就诊/取药/检验/缴费)';
CREATE INDEX IF NOT EXISTS eul_card ON ehcard_usage_log(card_id);
CREATE INDEX IF NOT EXISTS eul_time ON ehcard_usage_log(usage_time);

3.5 API接口设计

路径前缀: /healthlink-his/api/v1/ehcard

方法 路径 说明 请求体
POST /apply 申请健康卡 EhcardApplyDto
GET /info/{patientId} 查询患者健康卡
GET /info/card/{cardNo} 按卡号查询
POST /bind 绑定健康卡 params: cardNo, patientId
POST /unbind 解绑 params: cardId
POST /loss 挂失 params: cardId, reason
POST /replace 补办 params: cardId
POST /cancel 注销 params: cardId, reason
POST /verify 就诊验证 params: cardNo, encounterId
GET /usage/log 使用记录 params: cardId, startDate, endDate
GET /qr/{cardId} 获取二维码
GET /statistics 统计概览

3.6 前端设计

页面 路径 组件
健康卡管理 ehcard/manage/index.vue 卡列表 + 状态筛选
卡详情 ehcard/detail/index.vue 卡信息 + 使用记录
申请健康卡 ehcard/apply/index.vue 表单:身份证+手机号
挂失/补办 ehcard/operation/index.vue 操作弹窗

健康卡管理页面布局

┌──────────────────────────────────────────────────┐
│  筛选栏:[状态] [患者姓名] [卡号] [搜索] [重置]    │
├──────────────────────────────────────────────────┤
│  统计卡片:有效卡 | 挂失卡 | 今日申领 | 今日使用     │
├──────────────────────────────────────────────────┤
│  表格:                                          │
│  卡号 | 患者 | 状态 | 绑定时间 | 操作              │
│  ...  | ... | 有效 | ...     | [详情][挂失][注销]  │
└──────────────────────────────────────────────────┘

四、电子票据模块invoice— 新建

4.1 已有代码分析

完全缺失,无后端模块、无前端页面、无数据库表。

4.2 缺失功能清单

编号 功能 优先级
INV-01 电子发票生成(财政电子票据) P0
INV-02 票据核销(号段管理 + 对账) P0
INV-03 退票处理(作废 + 红冲) P0
INV-04 票据查询与下载 P0
INV-05 票据打印 P1
INV-06 票据统计报表 P2

4.3 业务流程

电子发票开具流程

患者缴费完成
  ├→ 系统自动生成电子发票
  ├→ 调用财政电子票据接口
  ├→ 获取财政票据号
  ├→ 生成PDF发票文件
  ├→ 存储到文件服务
  └→ 推送到患者手机/邮箱

退票流程

患者申请退费
  ├→ 窗口/自助发起退票
  ├→ 财务审核
  ├→ 调用财政系统作废接口
  ├→ 生成红冲发票
  ├→ 更新原发票状态为VOIDED
  └→ 退费到原支付渠道

4.4 数据库设计

-- V47__invoice.sql

-- 电子票据主表
CREATE TABLE IF NOT EXISTS eh_invoice (
    id BIGSERIAL PRIMARY KEY,
    invoice_no VARCHAR(50) NOT NULL,
    invoice_code VARCHAR(50),
    fiscal_no VARCHAR(100),
    invoice_type VARCHAR(30) NOT NULL,
    patient_id BIGINT NOT NULL,
    patient_name VARCHAR(50),
    id_card VARCHAR(30),
    encounter_id BIGINT,
    encounter_no VARCHAR(50),
    payment_id BIGINT,
    total_amount DECIMAL(12,2) NOT NULL,
    paid_amount DECIMAL(12,2) DEFAULT 0,
    insurance_amount DECIMAL(12,2) DEFAULT 0,
    self_pay_amount DECIMAL(12,2) DEFAULT 0,
    pay_method VARCHAR(30),
    invoice_status VARCHAR(20) DEFAULT 'VALID',
    void_reason TEXT,
    void_time TIMESTAMP,
    void_by VARCHAR(64),
    red_ream_id BIGINT,
    pdf_path VARCHAR(500),
    xml_path VARCHAR(500),
    qr_code TEXT,
    issue_time TIMESTAMP NOT NULL,
    issue_by VARCHAR(64),
    tenant_id INTEGER DEFAULT 0,
    delete_flag CHAR(1) DEFAULT '0',
    create_by VARCHAR(64),
    create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    update_by VARCHAR(64),
    update_time TIMESTAMP
);
COMMENT ON TABLE eh_invoice IS '电子票据主表';
COMMENT ON COLUMN eh_invoice.invoice_type IS '类型(ORDINARY普通/REFUND退票/RED_RED冲)';
COMMENT ON COLUMN eh_invoice.invoice_status IS '状态(VALID有效/VOIDED已作废/REFUNDED已退票)';
CREATE INDEX IF NOT EXISTS ei_patient ON eh_invoice(patient_id);
CREATE INDEX IF NOT EXISTS ei_encounter ON eh_invoice(encounter_id);
CREATE INDEX IF NOT EXISTS ei_status ON eh_invoice(invoice_status);
CREATE INDEX IF NOT EXISTS ei_fiscal ON eh_invoice(fiscal_no);

-- 票据明细
CREATE TABLE IF NOT EXISTS eh_invoice_item (
    id BIGSERIAL PRIMARY KEY,
    invoice_id BIGINT NOT NULL,
    item_name VARCHAR(200) NOT NULL,
    item_code VARCHAR(50),
    item_type VARCHAR(30),
    quantity DECIMAL(10,4) DEFAULT 1,
    unit_price DECIMAL(12,4),
    amount DECIMAL(12,2) NOT NULL,
    sort_order INT DEFAULT 0,
    tenant_id INTEGER DEFAULT 0,
    delete_flag CHAR(1) DEFAULT '0',
    create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
COMMENT ON TABLE eh_invoice_item IS '票据明细';
CREATE INDEX IF NOT EXISTS eii_invoice ON eh_invoice_item(invoice_id);

-- 票据号段管理
CREATE TABLE IF NOT EXISTS eh_invoice_segment (
    id BIGSERIAL PRIMARY KEY,
    segment_code VARCHAR(50) NOT NULL,
    invoice_type VARCHAR(30) NOT NULL,
    start_no VARCHAR(50) NOT NULL,
    end_no VARCHAR(50) NOT NULL,
    current_no VARCHAR(50),
    total_count INT NOT NULL,
    used_count INT DEFAULT 0,
    remaining_count INT,
    status VARCHAR(20) DEFAULT 'ACTIVE',
    org_code VARCHAR(50),
    org_name VARCHAR(200),
    start_date DATE,
    end_date DATE,
    tenant_id INTEGER DEFAULT 0,
    delete_flag CHAR(1) DEFAULT '0',
    create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    update_time TIMESTAMP
);
COMMENT ON TABLE eh_invoice_segment IS '票据号段管理';
CREATE UNIQUE INDEX IF NOT EXISTS eis_segment ON eh_invoice_segment(segment_code);

-- 票据对账记录
CREATE TABLE IF NOT EXISTS eh_invoice_reconciliation (
    id BIGSERIAL PRIMARY KEY,
    recon_date DATE NOT NULL,
    recon_type VARCHAR(30) NOT NULL,
    total_count INT DEFAULT 0,
    total_amount DECIMAL(12,2) DEFAULT 0,
    matched_count INT DEFAULT 0,
    unmatched_count INT DEFAULT 0,
    match_rate DECIMAL(5,2),
    status VARCHAR(20) DEFAULT 'PENDING',
    detail_json TEXT,
    reconciler VARCHAR(64),
    reconcile_time TIMESTAMP,
    tenant_id INTEGER DEFAULT 0,
    delete_flag CHAR(1) DEFAULT '0',
    create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
COMMENT ON TABLE eh_invoice_reconciliation IS '票据对账记录';
COMMENT ON COLUMN eh_invoice_reconciliation.recon_type IS '类型(FISCAL财政/HOSPITAL医院)';
CREATE INDEX IF NOT EXISTS eir_date ON eh_invoice_reconciliation(recon_date);

4.5 API接口设计

路径前缀: /healthlink-his/api/v1/invoice

方法 路径 说明 请求体
POST /issue 开具发票 InvoiceIssueDto
GET /info/{id} 发票详情
GET /list 发票列表 params: status, patientName, startDate, endDate
POST /void/{id} 作废发票 params: reason
POST /refund/{id} 退票 params: reason
GET /print/{id} 获取打印数据
GET /pdf/{id} 下载PDF
GET /segment/list 号段列表
POST /segment 新增号段 SegmentDto
POST /reconcile 发起对账 params: reconType, date
GET /reconcile/list 对账记录 params: startDate, endDate
GET /statistics/summary 统计概览 params: startDate, endDate

4.6 前端设计

页面 路径 组件
发票管理 invoice/manage/index.vue 发票列表 + 操作
发票详情 invoice/detail/index.vue 详情 + PDF预览
号段管理 invoice/segment/index.vue 号段配置
对账管理 invoice/reconciliation/index.vue 对账列表
统计报表 invoice/statistics/index.vue 图表

五、DRG/DIP深化模块ybmanage扩展

5.1 已有代码分析

后端54个文件

  • YbController.java — 1065行20+个端点(签到/读卡/目录/对账/清算/入院/出院)
  • YbElepController.java — 电子病历相关
  • YbExtController.java — 扩展接口
  • DTO类30+个Service 7个Mapper 2个Util 2个

已有数据库表V28/V30/V33/V35

  • mr_drg_grouping — DRG/DIP分组结果encounterId/drgCode/drgWeight/dipCode/totalCost等
  • drg_analysis_stats — DRG分析统计
  • drg_performance — DRG绩效
  • drg_cost_alert — DRG费用异常预警expectedCost/actualCost/costDeviation/alertType等

前端15个页面14个有script

  • ybmanagement/ — 包含患者信息、入院登记、出院诊断、医保对账等

5.2 缺失功能清单

编号 功能 优先级
DRG-01 广西DRG分组方案2024版维护 P0
DRG-02 广西DIP病种分值库 P0
DRG-03 费用预警规则引擎(超标/住院日/再入院) P0
DRG-04 DRG/DIP优化建议算法 P1
DRG-05 医保对账/清算(广西接口适配) P1
DRG-06 DRG绩效考核看板 P2
DRG-07 病案首页质控DRG入组前校验 P1

5.3 业务流程

DRG入组优化流程

病案首页完成
  ├→ 病案首页质控ICD编码校验/手术操作完整性/主诊断合理性
  ├→ DRG/DIP预分组根据广西2024版分组方案计算
  ├→ 费用预警检查对比同DRG组平均费用
  ├→ 生成优化建议:住院日调整/费用控制/编码优化
  ├→ 医生确认/修改
  └→ 正式入组上报

费用预警处理流程

入院时/住院中/出院时 触发预警
  ├→ 系统自动检测:费用/住院日/再入院
  ├→ 生成预警记录 → drg_cost_alert
  ├→ 推送到医生工作站
  ├→ 医生处理:填写处理意见
  ├→ 科主任复核
  └→ 归档

5.4 数据库设计

-- V47__drg_dip_enhancement.sql

-- 广西DRG分组方案2024版
CREATE TABLE IF NOT EXISTS gx_drg_grouping_scheme (
    id BIGSERIAL PRIMARY KEY,
    scheme_code VARCHAR(20) NOT NULL,
    scheme_name VARCHAR(200) NOT NULL,
    scheme_version VARCHAR(20) NOT NULL,
    effective_date DATE NOT NULL,
    expiry_date DATE,
    drg_group VARCHAR(20) NOT NULL,
    drg_code VARCHAR(20) NOT NULL,
    drg_name VARCHAR(200),
    drg_weight DECIMAL(8,4),
    avg_los DECIMAL(6,2),
    avg_cost DECIMAL(12,2),
    avg_mdc VARCHAR(20),
    severity_level VARCHAR(20),
    enabled CHAR(1) DEFAULT '1',
    tenant_id INTEGER DEFAULT 0,
    delete_flag CHAR(1) DEFAULT '0',
    create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    update_time TIMESTAMP
);
COMMENT ON TABLE gx_drg_grouping_scheme IS '广西DRG分组方案';
CREATE INDEX IF NOT EXISTS gds_code ON gx_drg_grouping_scheme(drg_code);
CREATE INDEX IF NOT EXISTS gds_group ON gx_drg_grouping_scheme(drg_group);

-- 广西DIP病种分值库
CREATE TABLE IF NOT EXISTS gx_dip_disease_score (
    id BIGSERIAL PRIMARY KEY,
    dip_code VARCHAR(20) NOT NULL,
    dip_name VARCHAR(200) NOT NULL,
    disease_code VARCHAR(20),
    disease_name VARCHAR(200),
    procedure_code VARCHAR(20),
    procedure_name VARCHAR(200),
    score DECIMAL(8,4) NOT NULL,
    avg_los DECIMAL(6,2),
    avg_cost DECIMAL(12,2),
    weight_factor DECIMAL(6,4) DEFAULT 1.0,
    severity VARCHAR(20),
    effective_date DATE,
    expiry_date DATE,
    enabled CHAR(1) DEFAULT '1',
    tenant_id INTEGER DEFAULT 0,
    delete_flag CHAR(1) DEFAULT '0',
    create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    update_time TIMESTAMP
);
COMMENT ON TABLE gx_dip_disease_score IS '广西DIP病种分值库';
CREATE INDEX IF NOT EXISTS gdd_code ON gx_dip_disease_score(dip_code);
CREATE INDEX IF NOT EXISTS gdd_disease ON gx_dip_disease_score(disease_code);

-- DRG优化建议
CREATE TABLE IF NOT EXISTS drg_optimization_suggestion (
    id BIGSERIAL PRIMARY KEY,
    encounter_id BIGINT NOT NULL,
    patient_id BIGINT NOT NULL,
    patient_name VARCHAR(50),
    drg_code VARCHAR(20),
    dip_code VARCHAR(20),
    suggestion_type VARCHAR(30) NOT NULL,
    current_value TEXT,
    suggested_value TEXT,
    expected_saving DECIMAL(12,2),
    priority INT DEFAULT 0,
    suggestion_text TEXT NOT NULL,
    evidence_source VARCHAR(100),
    handle_status VARCHAR(20) DEFAULT 'PENDING',
    handler VARCHAR(64),
    handle_time TIMESTAMP,
    handle_result TEXT,
    accept_flag BOOLEAN,
    tenant_id INTEGER DEFAULT 0,
    delete_flag CHAR(1) DEFAULT '0',
    create_by VARCHAR(64),
    create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
COMMENT ON TABLE drg_optimization_suggestion IS 'DRG优化建议';
COMMENT ON COLUMN drg_optimization_suggestion.suggestion_type IS '类型(COST费用/LOS住院日/CODING编码/PROCEDURE手术)';
CREATE INDEX IF NOT EXISTS dos_encounter ON drg_optimization_suggestion(encounter_id);

-- 病案首页质控记录
CREATE TABLE IF NOT EXISTS drg_quality_check (
    id BIGSERIAL PRIMARY KEY,
    encounter_id BIGINT NOT NULL,
    patient_id BIGINT NOT NULL,
    check_type VARCHAR(30) NOT NULL,
    check_rule VARCHAR(100),
    check_result VARCHAR(20) NOT NULL,
    error_message TEXT,
    field_name VARCHAR(100),
    field_value TEXT,
    suggestion TEXT,
    handle_status VARCHAR(20) DEFAULT 'PENDING',
    handler VARCHAR(64),
    handle_time TIMESTAMP,
    tenant_id INTEGER DEFAULT 0,
    delete_flag CHAR(1) DEFAULT '0',
    create_by VARCHAR(64),
    create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
COMMENT ON TABLE drg_quality_check IS '病案首页质控记录';
COMMENT ON COLUMN drg_quality_check.check_type IS '类型(ICD编码/主诊断/手术操作/完整性和逻辑性)';
COMMENT ON COLUMN drg_quality_check.check_result IS '结果(PASS通过/WARN警告/ERROR错误)';
CREATE INDEX IF NOT EXISTS dqct_encounter ON drg_quality_check(encounter_id);
CREATE INDEX IF NOT EXISTS dqct_result ON drg_quality_check(check_result);

-- 医保对账记录(广西适配)
CREATE TABLE IF NOT EXISTS yb_gx_reconciliation (
    id BIGSERIAL PRIMARY KEY,
    recon_month VARCHAR(7) NOT NULL,
    recon_type VARCHAR(30) NOT NULL,
    total_settlements INT DEFAULT 0,
    total_medical_fee DECIMAL(14,2) DEFAULT 0,
    total_fund_pay DECIMAL(14,2) DEFAULT 0,
    total_self_pay DECIMAL(14,2) DEFAULT 0,
    hospital_medical_fee DECIMAL(14,2) DEFAULT 0,
    difference_amount DECIMAL(14,2) DEFAULT 0,
    difference_reason TEXT,
    status VARCHAR(20) DEFAULT 'PENDING',
    reconciler VARCHAR(64),
    reconcile_time TIMESTAMP,
    file_path VARCHAR(500),
    tenant_id INTEGER DEFAULT 0,
    delete_flag CHAR(1) DEFAULT '0',
    create_by VARCHAR(64),
    create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
COMMENT ON TABLE yb_gx_reconciliation IS '广西医保对账记录';
COMMENT ON COLUMN yb_gx_reconciliation.recon_type IS '类型(MONTHLY月度/SPECIAL专项)';
CREATE INDEX IF NOT EXISTS ygr_month ON yb_gx_reconciliation(recon_month);

5.5 API接口设计

路径前缀: /healthlink-his/api/v1/ybmanage

方法 路径 说明 请求体
GET /drg/scheme/list DRG方案列表 params: enabled
POST /drg/scheme 新增/修改方案 DrgSchemeDto
POST /drg/scheme/import 导入方案Excel file
GET /dip/score/list DIP分值列表 params: keyword
POST /dip/score 新增/修改分值 DipScoreDto
POST /dip/score/import 导入分值库 file
POST /drg/pre-group DRG预分组 params: encounterId
POST /dip/pre-group DIP预分值 params: encounterId
GET /drg/alert/list 预警列表 params: alertType, alertLevel, status
PUT /drg/alert/{id}/handle 处理预警 AlertHandleDto
GET /drg/suggestion/list 优化建议列表 params: encounterId
PUT /drg/suggestion/{id}/accept 接受建议 params: result
POST /drg/quality-check 病案质控 params: encounterId
GET /drg/quality-check/list 质控记录 params: encounterId
GET /drg/performance/dashboard 绩效看板 params: startDate, endDate
GET /gx-reconciliation/list 对账列表 params: month
POST /gx-reconciliation/reconcile 发起对账 params: month, type
GET /gx-reconciliation/{id}/detail 对账明细

5.6 前端设计

页面 路径 组件
DRG方案管理 ybmanagement/drgScheme/index.vue 方案列表 + 导入
DIP分值管理 ybmanagement/dipScore/index.vue 分值列表 + 导入
费用预警 ybmanagement/costAlert/index.vue 预警列表 + 处理
优化建议 ybmanagement/optimization/index.vue 建议列表 + 接受
病案质控 ybmanagement/qualityCheck/index.vue 质控结果
绩效看板 ybmanagement/performance/index.vue 图表 + 数据
广西对账 ybmanagement/gxReconciliation/index.vue 对账管理

费用预警页面布局

┌──────────────────────────────────────────────────┐
│  筛选:[预警类型] [预警级别] [状态] [日期范围]       │
├──────────────────────────────────────────────────┤
│  统计卡片:待处理 | 处理中 | 已处理 | 严重预警        │
├──────────────────────────────────────────────────┤
│  表格:                                          │
│  患者 | DRG | 预期费用 | 实际费用 | 偏差 | 操作      │
│  张三 | AA1 | 12000  | 18000  | 50% | [处理][详情]│
└──────────────────────────────────────────────────┘

六、Flyway迁移汇总

版本 文件名 模块 新增表
V47 V47__tcm_zhuang_diagnosis.sql 中医壮医 tcm_zhuang_diagnosis, tcm_constitution_questionnaire, tcm_constitution_answer, tcm_ethnic_drug, tcm_prescription_item
V47 V47__epidemic_enhancement.sql 传染病直报 epidemic_screening_rule, epidemic_screening_hit, epidemic_cdc_submission, epidemic_disease_catalog + 扩展epidemic_report
V47 V47__ehcard.sql 电子健康卡 ehcard, ehcard_usage_log
V47 V47__invoice.sql 电子票据 eh_invoice, eh_invoice_item, eh_invoice_segment, eh_invoice_reconciliation
V47 V47__drg_dip_enhancement.sql DRG深化 gx_drg_grouping_scheme, gx_dip_disease_score, drg_optimization_suggestion, drg_quality_check, yb_gx_reconciliation

注意实际实施时需拆分为多个V47/V48/V49版本避免单次迁移过大。


七、后端模块结构汇总

7.1 新建模块

com.healthlink.his.web.ehcard/
├── controller/EhcardController.java
├── appservice/IEhcardAppService.java
├── appservice/impl/EhcardAppServiceImpl.java
└── dto/EhcardApplyDto.java, EhcardUsageLogDto.java

com.healthlink.his.web.invoice/
├── controller/InvoiceController.java
├── appservice/IInvoiceAppService.java
├── appservice/impl/InvoiceAppServiceImpl.java
└── dto/InvoiceIssueDto.java, InvoiceItemDto.java, SegmentDto.java

7.2 扩展模块

com.healthlink.his.web.tcm/
├── controller/TcmController.java (升级)
├── controller/ZhuangDiagnosisController.java (新增)
├── appservice/ITcmAppService.java (升级)
├── appservice/IZhuangDiagnosisAppService.java (新增)
├── appservice/impl/ZhuangDiagnosisAppServiceImpl.java (新增)
└── dto/ZhuangDiagnosisDto.java, ConstitutionAssessDto.java

com.healthlink.his.web.epidemic/
├── controller/EpidemicController.java (升级)
├── controller/ScreeningController.java (新增)
├── appservice/IEpidemicAppService.java (升级)
├── appservice/IScreeningAppService.java (新增)
├── appservice/impl/ScreeningAppServiceImpl.java (新增)
└── dto/ScreeningRuleDto.java, CdcSubmissionDto.java

com.healthlink.his.web.ybmanage/
├── controller/YbDrgController.java (新增)
├── controller/YbReconciliationController.java (新增)
├── service/IDrgGroupingService.java (新增)
├── service/IDipScoreService.java (新增)
├── service/impl/DrgGroupingServiceImpl.java (新增)
├── service/impl/DipScoreServiceImpl.java (新增)
└── dto/DrgSchemeDto.java, DipScoreDto.java, AlertHandleDto.java

八、前端模块结构汇总

8.1 新建目录

src/views/ehcard/
├── manage/index.vue          # 健康卡管理
├── detail/index.vue          # 卡详情
├── apply/index.vue           # 申请健康卡
└── api.js                    # API定义

src/views/invoice/
├── manage/index.vue          # 发票管理
├── detail/index.vue          # 发票详情
├── segment/index.vue         # 号段管理
├── reconciliation/index.vue  # 对账管理
├── statistics/index.vue      # 统计报表
└── api.js                    # API定义

8.2 扩展目录

src/views/tcm/
├── traditional/index.vue     # 已有,升级
├── constitution/index.vue    # 已有,升级
├── zhuangDiagnosis/index.vue # 新增
├── ethnicDrug/index.vue      # 新增
├── prescriptionTemplate/index.vue # 新增
└── prescription/index.vue    # 新增

src/views/diseaseReportManagement/
├── ReportManagement/         # 已有,升级
├── ReportDetail/index.vue    # 新增
├── ScreeningRule/index.vue   # 新增
├── Statistics/index.vue      # 新增
└── DiseaseCatalog/index.vue  # 新增

src/views/ybmanagement/
├── drgScheme/index.vue       # 新增
├── dipScore/index.vue        # 新增
├── costAlert/index.vue       # 新增
├── optimization/index.vue    # 新增
├── qualityCheck/index.vue    # 新增
├── performance/index.vue     # 新增
└── gxReconciliation/index.vue # 新增

九、实施顺序建议

Sprint 模块 工作量估算 依赖
Sprint 1 电子健康卡ehcard 5天
Sprint 2 电子票据invoice 5天
Sprint 3 传染病直报升级epidemic 4天 广西疾控接口文档
Sprint 4 中医壮医扩展tcm 5天 壮医三诊标准
Sprint 5 DRG/DIP深化ybmanage 6天 广西2024版分组方案

每个Sprint完成后需通过编译验证mvn compile + npm run build:dev