8.2 KiB
8.2 KiB
HIS-GUI 支付系统 - 快速开始
💡 5分钟快速上手
编译支付系统
cd /home/e2hang/code/HIS-GUI
mkdir -p build && cd build
cmake ..
make -j4
运行系统
./his_gui
🚀 基本使用
1. 创建支付记录
场景:患者挂号需要支付50元
#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. 生成结算单
场景:患者出院,需要结算
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. 查看报表
// 获取今日统计
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;
📊 数据库操作示例
查询患者的所有支付记录
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);
查询特定类型的支付
// 查询所有"检查"类型的支付
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);
}
);
查询结算单
// 查询患者的所有结算单
core.settlementService.findByPatientId("P001",
[](const std::string& key, const Settlement& s) {
printf("结算单: %s, 总额: ¥%.2f\n", key.c_str(), s.TotalAmount);
}
);
🎯 GUI使用指南
支付对话框
#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);
}
支付管理界面
#include "gui/payment_management_dialog.h"
PaymentManagementDialog dlg(core_);
dlg.exec(); // 打开支付管理界面
结算单管理
#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() |
处理退款 |
💻 代码示例
完整的支付流程示例
#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: 找不到支付记录?
// 确保在生成报表前调用了 completePayment()
if (core.paymentService.completePayment(paymentID)) {
// 现在可以看到已完成的支付
}
Q: 结算单费用计算错误?
// 确保调用了 calculateSettlement()
core.settlementService.calculateSettlement(settlementID);
// 验证费用项是否正确
const Settlement* s = core.settlementService.findSettlement(settlementID);
printf("总费用: %.2f\n", s->TotalAmount);
Q: 数据未保存?
// 数据自动保存到文件,检查 data/payments.txt 和 data/settlements.txt
// 调试时可使用:
FILE* f = fopen("data/payments.txt", "r");
// ... 检查文件内容 ...
📚 更多文档
🆘 获取帮助
如遇到问题,请:
- 查看日志文件:
logs/his.log - 检查数据文件:
data/payments.txt和data/settlements.txt - 参考集成指南和设计文档
- 在代码中添加调试信息
祝你使用愉快! 🎉