Files
HIS-GUI/docs/支付系统快速开始.md
2026-04-06 16:23:17 +08:00

349 lines
8.2 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# HIS-GUI 支付系统 - 快速开始
## 💡 5分钟快速上手
### 编译支付系统
```bash
cd /home/e2hang/code/HIS-GUI
mkdir -p build && cd build
cmake ..
make -j4
```
### 运行系统
```bash
./his_gui
```
## 🚀 基本使用
### 1. 创建支付记录
**场景**患者挂号需要支付50元
```cpp
#include "core/his_core.h"
#include "models/payment.h"
// 假设已有HisCore实例
core::HisCore core;
// 创建支付
std::string paymentID;
core.paymentService.createPayment(
"P001", // 患者ID
50.0, // 金额
PaymentMethod::Cash, // 支付方式
"挂号", // 支付类型
"REG_001", // 操作ID
"挂号费用", // 描述
paymentID // 输出: 支付ID
);
// 完成支付
core.paymentService.completePayment(paymentID);
```
### 2. 生成结算单
**场景**:患者出院,需要结算
```cpp
std::string settlementID;
// 生成结算单
core.settlementService.generateSettlement(
"P001",
"张三",
"2025-04-06",
settlementID
);
// 添加费用项
SettlementItem items[] = {
{"挂号费", "Registration", "REG_001", 1, 50.0},
{"检查费", "Check", "CHECK_001", 1, 200.0},
{"药品费", "Medicine", "MED_001", 5, 20.0}
};
for (const auto& item : items) {
core.settlementService.addItemToSettlement(settlementID, item);
}
// 计算总金额
core.settlementService.calculateSettlement(settlementID);
// 完成结算
core.settlementService.completeSettlement(settlementID);
```
### 3. 查看报表
```cpp
// 获取今日统计
auto stats = core.paymentManagementService.getTodayPaymentStatistics();
printf("今日收入: ¥%.2f\n", stats.TotalRevenue);
printf("已完成支付: %d笔\n", stats.CompletedPayments);
// 生成日报表
auto report = core.paymentManagementService.generateDailyReport("2025-04-06");
cout << report << endl;
```
## 📊 数据库操作示例
### 查询患者的所有支付记录
```cpp
double totalPaid = 0;
core.paymentService.findByPatientId("P001",
[&totalPaid](const std::string& key, const Payment& p) {
if (p.Status == "Completed") {
totalPaid += p.Amount;
printf("%s: ¥%.2f (%s)\n",
p.PaymentType.c_str(), p.Amount, p.getMethodString().c_str());
}
}
);
printf("总支付: ¥%.2f\n", totalPaid);
```
### 查询特定类型的支付
```cpp
// 查询所有"检查"类型的支付
core.paymentService.findByPaymentType("检查",
[](const std::string& key, const Payment& p) {
printf("%s - ID: %s, 金额: ¥%.2f\n",
p.PatientID.c_str(), key.c_str(), p.Amount);
}
);
```
### 查询结算单
```cpp
// 查询患者的所有结算单
core.settlementService.findByPatientId("P001",
[](const std::string& key, const Settlement& s) {
printf("结算单: %s, 总额: ¥%.2f\n", key.c_str(), s.TotalAmount);
}
);
```
## 🎯 GUI使用指南
### 支付对话框
```cpp
#include "gui/payment_dialog.h"
PaymentDialog dlg(core_);
dlg.setPaymentInfo("P001", "患者名字", "检查", 200.0);
if (dlg.exec() == QDialog::Accepted && dlg.isPaymentSuccessful()) {
QString paymentID = dlg.getPaymentID();
QMessageBox::information(nullptr, "成功", "支付ID: " + paymentID);
}
```
### 支付管理界面
```cpp
#include "gui/payment_management_dialog.h"
PaymentManagementDialog dlg(core_);
dlg.exec(); // 打开支付管理界面
```
### 结算单管理
```cpp
#include "gui/settlement_dialog.h"
SettlementDialog dlg(core_);
dlg.createNewSettlement("P001", "张三", "2025-04-06");
dlg.exec();
```
## 📁 文件位置
- **支付记录**: `data/payments.txt`
- **结算单**: `data/settlements.txt`
- **日志**: `logs/his.log`
## 🔑 关键类和方法
### PaymentService
| 方法 | 说明 |
|-----|------|
| `createPayment()` | 创建支付记录 |
| `completePayment()` | 完成支付 |
| `refundPayment()` | 退款 |
| `getTotalPaymentAmount()` | 获取总支付金额 |
| `findByPatientId()` | 按患者查询 |
### SettlementService
| 方法 | 说明 |
|-----|------|
| `generateSettlement()` | 生成结算单 |
| `addItemToSettlement()` | 添加费用项 |
| `calculateSettlement()` | 计算费用 |
| `completeSettlement()` | 完成结算 |
| `generateSettlementReport()` | 生成报告 |
### PaymentManagementService
| 方法 | 说明 |
|-----|------|
| `getPaymentStatistics()` | 获取统计信息 |
| `generateDailyReport()` | 日报表 |
| `generateMonthlyReport()` | 月报表 |
| `processRefund()` | 处理退款 |
## 💻 代码示例
### 完整的支付流程示例
```cpp
#include "core/his_core.h"
#include "models/payment.h"
#include "models/settlement.h"
int main() {
// 1. 初始化系统
core::HisCore core;
std::string error;
if (!core.loadDataFromFolder("./data", error)) {
std::cerr << "Failed to load data: " << error << std::endl;
return 1;
}
// 2. 创建支付(挂号)
std::string paymentID;
core.paymentService.createPayment(
"P001", 50.0, PaymentMethod::Cash, "挂号", "REG_001",
"挂号费用", paymentID
);
core.paymentService.completePayment(paymentID);
std::cout << "支付成功: " << paymentID << std::endl;
// 3. 创建支付(检查)
std::string checkPaymentID;
core.paymentService.createPayment(
"P001", 200.0, PaymentMethod::CreditCard, "检查", "CHECK_001",
"CT扫描", checkPaymentID
);
core.paymentService.completePayment(checkPaymentID);
// 4. 生成结算单
std::string settlementID;
core.settlementService.generateSettlement("P001", "张三", "2025-04-06", settlementID);
// 5. 添加费用项
SettlementItem item1("挂号费", "Registration", "REG_001", 1, 50.0);
core.settlementService.addItemToSettlement(settlementID, item1);
SettlementItem item2("检查费", "Check", "CHECK_001", 1, 200.0);
core.settlementService.addItemToSettlement(settlementID, item2);
// 6. 计算费用
core.settlementService.calculateSettlement(settlementID);
// 7. 显示结算单
auto report = core.settlementService.generateSettlementReport(settlementID);
std::cout << report << std::endl;
// 8. 完成结算
core.settlementService.completeSettlement(settlementID);
// 9. 生成报表
auto stats = core.paymentManagementService.getPaymentStatistics();
std::cout << "总收入: ¥" << stats.TotalRevenue << std::endl;
return 0;
}
```
### 输出示例
```
支付成功: PAY_abc123
========== 医疗费用结算单 ==========
结算单号: SET_xyz789
患者姓名: 张三
患者ID: P001
出院日期: 2025-04-06
---------- 费用明细 ----------
项目: 挂号费
数量: 1, 单价: 50, 金额: 50
支付方式:
项目: 检查费
数量: 1, 单价: 200, 金额: 200
支付方式:
---------- 费用总结 ----------
医疗总费用: ¥250.00
医保支付: ¥125.00
患者自付: ¥125.00
结算状态: Completed
备注:
===================================
总收入: ¥250.00
```
## 🐛 常见问题排查
### Q: 找不到支付记录?
```cpp
// 确保在生成报表前调用了 completePayment()
if (core.paymentService.completePayment(paymentID)) {
// 现在可以看到已完成的支付
}
```
### Q: 结算单费用计算错误?
```cpp
// 确保调用了 calculateSettlement()
core.settlementService.calculateSettlement(settlementID);
// 验证费用项是否正确
const Settlement* s = core.settlementService.findSettlement(settlementID);
printf("总费用: %.2f\n", s->TotalAmount);
```
### Q: 数据未保存?
```cpp
// 数据自动保存到文件,检查 data/payments.txt 和 data/settlements.txt
// 调试时可使用:
FILE* f = fopen("data/payments.txt", "r");
// ... 检查文件内容 ...
```
## 📚 更多文档
- [支付系统集成指南](./支付系统集成指南.md) - 详细集成说明
- [支付系统设计文档](./支付系统设计文档.md) - 系统架构和设计
- [README.md](./README.md) - 项目总体说明
## 🆘 获取帮助
如遇到问题,请:
1. 查看日志文件:`logs/his.log`
2. 检查数据文件:`data/payments.txt``data/settlements.txt`
3. 参考集成指南和设计文档
4. 在代码中添加调试信息
---
**祝你使用愉快!** 🎉