9.9 KiB
9.9 KiB
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------ | |
| | | |
|<---显示支付对话框-----| | |
| | | |
|--选择支付方式-------->| | |
| |--更新支付状态----->| |
|--完成支付----------->| | |
| |--保存支付记录------|----写入数据库----->|
|<--操作成功-----------| |<-确认写入---------|
| | | |
结算流程
- 出院时生成结算单:系统自动生成结算单,包含所有费用项
- 计算费用分配:系统计算医保支付部分和患者自付部分
- 生成结算报告:可打印或导出结算单
- 确认结算:患者和医院确认结算单,标记为已结算
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()可以获取异常支付记录(金额过大或支付失败)。
扩展建议
- 添加支付网关集成 - 与第三方支付平台(支付宝、微信等)集成
- 添加电子发票 - 为每次支付生成电子发票
- 添加医保对接 - 实时查询医保余额和支付情况
- 添加分期支付 - 支持分期支付功能
- 添加发票管理 - 完整的发票管理系统
编译和运行
mkdir build && cd build
cmake ..
make
./his_gui
支付系统已完全集成到HIS-GUI中,无需额外配置即可使用。