320 lines
9.9 KiB
Markdown
320 lines
9.9 KiB
Markdown
# HIS-GUI 支付系统集成指南
|
||
|
||
## 概述
|
||
|
||
本指南介绍了如何在HIS-GUI医院管理信息系统中集成和使用支付系统。支付系统完整支持患者挂号、检查、用药等所有付费操作的支付流程,并能够自动生成结算单和提供管理员管理界面。
|
||
|
||
## 系统架构
|
||
|
||
### 数据模型
|
||
- **Payment**(支付记录):记录每一次支付操作,包括患者ID、金额、支付方式、支付时间等
|
||
- **Settlement**(结算单):包含患者的所有费用明细和支付信息,在患者出院时生成
|
||
- **SettlementItem**(结算项目):结算单中的单条费用记录
|
||
|
||
### 核心服务
|
||
- **PaymentService**:处理支付操作(创建、查询、更新状态等)
|
||
- **SettlementService**:管理结算单的生成、修改、计算费用等
|
||
- **PaymentManagementService**:为管理员提供支付统计、报表生成等功能
|
||
|
||
### UI组件
|
||
- **PaymentDialog**:支付对话框,在用户进行付费操作时弹出
|
||
- **PaymentManagementDialog**:管理员支付管理界面,查看所有支付记录和生成报表
|
||
- **SettlementDialog**:结算单查看和管理界面
|
||
|
||
## 使用指南
|
||
|
||
### 1. 在挂号时集成支付
|
||
|
||
```cpp
|
||
// 在挂号对话框中
|
||
#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. 在检查时集成支付
|
||
|
||
```cpp
|
||
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. 在用药时集成支付
|
||
|
||
```cpp
|
||
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. 在患者出院时生成结算单
|
||
|
||
```cpp
|
||
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. 管理员查看支付记录和生成报表
|
||
|
||
```cpp
|
||
void MainWindow::onOpenPaymentManagement() {
|
||
PaymentManagementDialog paymentMgmtDlg(core_);
|
||
paymentMgmtDlg.exec();
|
||
}
|
||
```
|
||
|
||
## 支付流程时序图
|
||
|
||
```
|
||
患者 UI 支付系统 数据库
|
||
| | | |
|
||
|--进行付费操作-------->| | |
|
||
| |--创建支付记录----->| |
|
||
| |<--返回支付ID------ | |
|
||
| | | |
|
||
|<---显示支付对话框-----| | |
|
||
| | | |
|
||
|--选择支付方式-------->| | |
|
||
| |--更新支付状态----->| |
|
||
|--完成支付----------->| | |
|
||
| |--保存支付记录------|----写入数据库----->|
|
||
|<--操作成功-----------| |<-确认写入---------|
|
||
| | | |
|
||
```
|
||
|
||
## 结算流程
|
||
|
||
1. **出院时生成结算单**:系统自动生成结算单,包含所有费用项
|
||
2. **计算费用分配**:系统计算医保支付部分和患者自付部分
|
||
3. **生成结算报告**:可打印或导出结算单
|
||
4. **确认结算**:患者和医院确认结算单,标记为已结算
|
||
|
||
## API调用指南
|
||
|
||
### PaymentService
|
||
|
||
```cpp
|
||
// 创建支付记录
|
||
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
|
||
|
||
```cpp
|
||
// 生成结算单
|
||
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
|
||
|
||
```cpp
|
||
// 获取支付统计
|
||
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)
|
||
|
||
## 错误处理
|
||
|
||
```cpp
|
||
// 检查支付是否成功
|
||
if (paymentDlg.isPaymentSuccessful()) {
|
||
// 支付成功,继续流程
|
||
QString paymentID = paymentDlg.getPaymentID();
|
||
} else {
|
||
// 支付失败,显示错误信息
|
||
QMessageBox::warning(this, "支付失败", "请检查支付信息并重试");
|
||
}
|
||
```
|
||
|
||
## 日志查看
|
||
|
||
支付系统的所有操作都会被记录到日志中。可以通过以下方式查看:
|
||
|
||
```cpp
|
||
// 所有日志都会输出到控制台和日志文件
|
||
// 位置:logs/his.log
|
||
```
|
||
|
||
## 常见问题
|
||
|
||
### Q: 如何在现有的对话框中添加支付功能?
|
||
A: 参考上面的集成示例,只需在相应的操作完成后调用PaymentDialog并传入相应参数。
|
||
|
||
### Q: 支付记录和结算单有什么区别?
|
||
A: 支付记录记录的是单次支付操作(如一次挂号费),结算单是患者整个就诊过程中所有费用的汇总。
|
||
|
||
### Q: 如何自定义医保支付比例?
|
||
A: 修改Settlement::calculateTotals()方法中的计算逻辑,默认是50%医保/50%患者支付。
|
||
|
||
### Q: 如何处理支付异常?
|
||
A: PaymentManagementService::getAnomalousPayments()可以获取异常支付记录(金额过大或支付失败)。
|
||
|
||
## 扩展建议
|
||
|
||
1. **添加支付网关集成** - 与第三方支付平台(支付宝、微信等)集成
|
||
2. **添加电子发票** - 为每次支付生成电子发票
|
||
3. **添加医保对接** - 实时查询医保余额和支付情况
|
||
4. **添加分期支付** - 支持分期支付功能
|
||
5. **添加发票管理** - 完整的发票管理系统
|
||
|
||
## 编译和运行
|
||
|
||
```bash
|
||
mkdir build && cd build
|
||
cmake ..
|
||
make
|
||
./his_gui
|
||
```
|
||
|
||
支付系统已完全集成到HIS-GUI中,无需额外配置即可使用。
|