Files
HIS-GUI/docs/支付系统集成指南.md
2026-04-06 16:23:17 +08:00

9.9 KiB
Raw Permalink Blame History

HIS-GUI 支付系统集成指南

概述

本指南介绍了如何在HIS-GUI医院管理信息系统中集成和使用支付系统。支付系统完整支持患者挂号、检查、用药等所有付费操作的支付流程并能够自动生成结算单和提供管理员管理界面。

系统架构

数据模型

  • Payment支付记录记录每一次支付操作包括患者ID、金额、支付方式、支付时间等
  • Settlement(结算单):包含患者的所有费用明细和支付信息,在患者出院时生成
  • SettlementItem(结算项目):结算单中的单条费用记录

核心服务

  • PaymentService:处理支付操作(创建、查询、更新状态等)
  • SettlementService:管理结算单的生成、修改、计算费用等
  • PaymentManagementService:为管理员提供支付统计、报表生成等功能

UI组件

  • PaymentDialog:支付对话框,在用户进行付费操作时弹出
  • PaymentManagementDialog:管理员支付管理界面,查看所有支付记录和生成报表
  • SettlementDialog:结算单查看和管理界面

使用指南

1. 在挂号时集成支付

// 在挂号对话框中
#include "gui/payment_dialog.h"

void RegistrationDialog::onRegister() {
    // ... 挂号逻辑 ...
    
    double registrationFee = 50.0; // 挂号费50元
    
    PaymentDialog paymentDlg(core_);
    paymentDlg.setPaymentInfo(
        QString::fromStdString(patientID),
        QString::fromStdString(patientName),
        "挂号",
        registrationFee
    );
    
    if (paymentDlg.exec() == QDialog::Accepted && paymentDlg.isPaymentSuccessful()) {
        QString paymentID = paymentDlg.getPaymentID();
        // 保存支付记录ID到挂号记录中
        // ...
        QMessageBox::information(this, "成功", "挂号成功支付ID: " + paymentID);
    } else {
        QMessageBox::warning(this, "失败", "支付失败,挂号未完成");
    }
}

2. 在检查时集成支付

void CheckDialog::onSubmitCheck() {
    // ... 检查操作逻辑 ...
    
    double checkFee = 200.0; // 检查费200元
    
    PaymentDialog paymentDlg(core_);
    paymentDlg.setPaymentInfo(
        QString::fromStdString(patientID),
        QString::fromStdString(patientName),
        "检查",
        checkFee
    );
    
    if (paymentDlg.exec() == QDialog::Accepted && paymentDlg.isPaymentSuccessful()) {
        // 检查费用已支付
        saveCheckRecord();
    }
}

3. 在用药时集成支付

void MedicineDialog::onDispenseMedicine() {
    // ... 配药逻辑,计算总费用 ...
    
    double medicineFee = 150.0; // 药品费用总计150元
    
    PaymentDialog paymentDlg(core_);
    paymentDlg.setPaymentInfo(
        QString::fromStdString(patientID),
        QString::fromStdString(patientName),
        "用药",
        medicineFee
    );
    
    if (paymentDlg.exec() == QDialog::Accepted && paymentDlg.isPaymentSuccessful()) {
        // 立即配药
        dispenseMedicine();
    }
}

4. 在患者出院时生成结算单

void DischargeDialog::onDischargePatient() {
    std::string settlementID;
    
    // 生成结算单
    if (core_.settlementService.generateSettlement(
        patientID,
        patientName,
        currentDate,
        settlementID)) {
        
        // 添加所有的费用项
        // 挂号费
        SettlementItem registrationItem("挂号费", "Registration", registrationOpID, 1, 50.0);
        core_.settlementService.addItemToSettlement(settlementID, registrationItem);
        
        // 检查费
        SettlementItem checkItem("CT扫描", "Check", checkOpID, 1, 200.0);
        core_.settlementService.addItemToSettlement(settlementID, checkItem);
        
        // 药品费
        SettlementItem medicineItem("抗生素药物", "Medicine", medicineOpID, 10, 15.0);
        core_.settlementService.addItemToSettlement(settlementID, medicineItem);
        
        // 计算总金额
        core_.settlementService.calculateSettlement(settlementID);
        
        // 显示结算单
        SettlementDialog settlementDlg(core_);
        settlementDlg.displaySettlement(QString::fromStdString(settlementID));
        settlementDlg.exec();
    }
}

5. 管理员查看支付记录和生成报表

void MainWindow::onOpenPaymentManagement() {
    PaymentManagementDialog paymentMgmtDlg(core_);
    paymentMgmtDlg.exec();
}

支付流程时序图

患者                    UI                 支付系统              数据库
  |                      |                    |                    |
  |--进行付费操作-------->|                    |                    |
  |                      |--创建支付记录----->|                    |
  |                      |<--返回支付ID------  |                    |
  |                      |                    |                    |
  |<---显示支付对话框-----|                    |                    |
  |                      |                    |                    |
  |--选择支付方式-------->|                    |                    |
  |                      |--更新支付状态----->|                    |
  |--完成支付----------->|                    |                    |
  |                      |--保存支付记录------|----写入数据库----->|
  |<--操作成功-----------|                    |<-确认写入---------|
  |                      |                    |                    |

结算流程

  1. 出院时生成结算单:系统自动生成结算单,包含所有费用项
  2. 计算费用分配:系统计算医保支付部分和患者自付部分
  3. 生成结算报告:可打印或导出结算单
  4. 确认结算:患者和医院确认结算单,标记为已结算

API调用指南

PaymentService

// 创建支付记录
std::string paymentID;
core_.paymentService.createPayment(
    "PATIENT001",           // 患者ID
    200.0,                  // 支付金额
    PaymentMethod::Cash,    // 支付方式
    "检查",                 // 支付类型
    "CHECK_001",            // 操作ID
    "CT扫描费用",          // 描述
    paymentID               // 输出参数支付ID
);

// 更新支付状态
core_.paymentService.updatePaymentStatus(paymentID, "Completed");

// 完成支付
core_.paymentService.completePayment(paymentID);

// 退款
core_.paymentService.refundPayment(paymentID);

// 查询患者总支付金额
double totalPaid = core_.paymentService.getTotalPaymentAmount("PATIENT001");

SettlementService

// 生成结算单
std::string settlementID;
core_.settlementService.generateSettlement(
    "PATIENT001",
    "张三",
    "2025-04-06",
    settlementID
);

// 添加费用项
SettlementItem item("检查费", "Check", "CHECK_001", 1, 200.0);
core_.settlementService.addItemToSettlement(settlementID, item);

// 计算总金额
core_.settlementService.calculateSettlement(settlementID);

// 完成结算
core_.settlementService.completeSettlement(settlementID);

// 生成结算报告
std::string report = core_.settlementService.generateSettlementReport(settlementID);

PaymentManagementService

// 获取支付统计
auto stats = core_.paymentManagementService.getPaymentStatistics();
printf("总收入: %.2f\n", stats.TotalRevenue);
printf("已完成支付: %d笔\n", stats.CompletedPayments);

// 获取今日统计
auto todayStats = core_.paymentManagementService.getTodayPaymentStatistics();

// 生成报表
std::string dailyReport = core_.paymentManagementService.generateDailyReport("2025-04-06");
std::string monthlyReport = core_.paymentManagementService.generateMonthlyReport("2025-04");
std::string revenueReport = core_.paymentManagementService.generateRevenueReport();

// 处理退款
core_.paymentManagementService.processRefund("PAY_xxx", "患者要求退款");

数据持久化

支付系统的数据自动保存到以下文件:

  • /data/payments.txt - 支付记录
  • /data/settlements.txt - 结算单

系统启动时会自动加载这些文件。

支付方式

系统支持以下支付方式:

  • 现金 (Cash)
  • 信用卡 (CreditCard)
  • 移动支付 (MobilePayment) - 微信/支付宝等
  • 医保 (HealthInsurance)

错误处理

// 检查支付是否成功
if (paymentDlg.isPaymentSuccessful()) {
    // 支付成功,继续流程
    QString paymentID = paymentDlg.getPaymentID();
} else {
    // 支付失败,显示错误信息
    QMessageBox::warning(this, "支付失败", "请检查支付信息并重试");
}

日志查看

支付系统的所有操作都会被记录到日志中。可以通过以下方式查看:

// 所有日志都会输出到控制台和日志文件
// 位置logs/his.log

常见问题

Q: 如何在现有的对话框中添加支付功能?

A: 参考上面的集成示例只需在相应的操作完成后调用PaymentDialog并传入相应参数。

Q: 支付记录和结算单有什么区别?

A: 支付记录记录的是单次支付操作(如一次挂号费),结算单是患者整个就诊过程中所有费用的汇总。

Q: 如何自定义医保支付比例?

A: 修改Settlement::calculateTotals()方法中的计算逻辑默认是50%医保/50%患者支付。

Q: 如何处理支付异常?

A: PaymentManagementService::getAnomalousPayments()可以获取异常支付记录(金额过大或支付失败)。

扩展建议

  1. 添加支付网关集成 - 与第三方支付平台(支付宝、微信等)集成
  2. 添加电子发票 - 为每次支付生成电子发票
  3. 添加医保对接 - 实时查询医保余额和支付情况
  4. 添加分期支付 - 支持分期支付功能
  5. 添加发票管理 - 完整的发票管理系统

编译和运行

mkdir build && cd build
cmake ..
make
./his_gui

支付系统已完全集成到HIS-GUI中无需额外配置即可使用。