349 lines
8.2 KiB
Markdown
349 lines
8.2 KiB
Markdown
# 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. 在代码中添加调试信息
|
||
|
||
---
|
||
|
||
**祝你使用愉快!** 🎉
|